Выберите аргумент шаблона во время выполнения в C ++ - PullRequest
8 голосов
/ 04 марта 2009

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

Ответы [ 3 ]

19 голосов
/ 04 марта 2009

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

class Base
{
   ...
};

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

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

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

3 голосов
/ 04 марта 2009

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

2 голосов
/ 04 марта 2009

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

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

...