Действительно ли возможно выбрать C ++ универсальный параметр типа во времени выполнения?

Существует обновление вся опция на панели инструментов Pivot Table.Все, довольно. Не должны делать ничего больше.

ctrl+alt+F5

Нажатия
8
задан Shog9 14 November 2009 в 23:18
поделиться

5 ответов

Это вопрос времени компиляции. Типы параметров шаблона должны быть известны компилятору во время компиляции.

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

Например, используя частичную специализацию, вы можете выбрать тип во время компиляции на основе целого числа:

template <typename T>
class Foo
{ };

template <int N>
struct select_type;

template<>
struct select_type<1>
{
    typedef int type;
};

template<>
struct select_type<2>
{
    typedef float type;
};

int main()
{
    Foo<select_type<1>::type> f1; // will give you Foo<int>
    Foo<select_type<2>::type> f2; // will give you Foo<float>
}
11
ответ дан 5 December 2019 в 11:25
поделиться

Как и другие ответили, ответ на ваш вопрос - «Нет», C ++ не поддерживает динамическую типизацию во время выполнения. Я просто хотел отметить, что в зависимости от того, чего вы пытаетесь достичь,

2
ответ дан 5 December 2019 в 11:25
поделиться

Это возможно с помощью Boost.Variant (фиксированное количество различных типов) или Boost.Any (тип, который может хранить любой тип, в основном ваш «указатель void», но с информацией о типе).

Это также возможно, если String и Integer были производными от полиморфного базового класса. (Но для этого им пришлось бы реализовать один и тот же интерфейс, что может быть или невозможно в вашем случае.)

Как правило, полиморфизм - самый простой способ сделать это, и он действительно используется постоянно.

] Для использования Variant и Any требуется довольно много работы: вам все равно нужно каким-то образом получить содержимое в виде правильного типа, который они хранят. (Вроде как если бы вы использовали преобразование с понижением в производные классы вместо того, чтобы полагаться на вызовы полиморфных методов.)

2
ответ дан 5 December 2019 в 11:25
поделиться

Я не могу придумать ситуацию, в которой это было бы полезно, но…

#include "boost/variant.hpp"
#include <list>
#include <string>

boost::variant<std::list<int>, std::list<std::string> >
unknown(int someval) {
    if (someval == 1)
        return boost::variant<std::list<int>, std::list<std::string> >(
                std::list<int>());
    else if (someval == 2)
        return boost::variant<std::list<int>, std::list<std::string> >(
                std::list<std::string>());
}
0
ответ дан 5 December 2019 в 11:25
поделиться

Ближайшее, что вы получите:

template <typename T>
void do_stuff_with_list
{
    list<T> myList;
    ...
}

enum Type
{
   Integer = 1,
   String
};

void do_stuff(Type type)
{
    switch (type)
    {
    case Integer:
        do_stuff_with_list<int>();
        break;
    case String:
        do_stuff_with_list<string>();
        break;
    };
}
0
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: