2009-03-03 9 views
8

Предположим, что у меня есть набор функций и классов, которые предназначены для использования одиночной (float) или double точности. Конечно, я мог бы написать всего два куска кода начальной загрузки или испортить макросы. Но могу ли я просто переключить аргумент шаблона во время выполнения?Выберите аргумент шаблона во время выполнения в C++

ответ

19

Нет, вы не можете переключать аргументы шаблона во время выполнения, поскольку шаблоны создаются компилятором во время компиляции. То, что вы может сделать, это как шаблоны проистекают из общего базового класса, всегда использовать базовый класс в вашем коде, а затем решить, какой производный класс для использования во время выполнения:

class Base 
{ 
    ... 
}; 

template <typename T> 
class Foo : public Base 
{ 
    ... 
}; 

Base *newBase() 
{ 
    if(some condition) 
     return new Foo<float>(); 
    else 
     return new Foo<double>(); 
} 

Макросов имеют те же проблемы, шаблонов, поскольку они расширяются во время компиляции.

3

Шаблоны - это механизм времени компиляции. Кстати, макросы тоже (строго говоря - механизм предварительной обработки), который приходит даже до компиляции).

2

Шаблоны - это просто конструкция времени компиляции, компилятор будет расширять шаблон и создавать свой класс/функцию с указанным аргументом и напрямую переводить его в код.

Если вы пытаетесь переключаться между foo<float> и foo<double> во время выполнения, вам нужно либо использовать некоторые метапрограммы, либо просто иметь отдельные пути кода для каждого.