Шаблоны C ++ обращаются к функции с разными типами - PullRequest
0 голосов
/ 30 августа 2018

Так что я пытаюсь сделать что-то вроде этого.

У меня есть структура шаблона, подобная этой:

template <typename T>
struct TemplateTest
{
    void test(T a)
    {
        switch (typeid(boost::any_cast<T>(a)))
        {
        case typeid(int):
            {
                std::cout << "INT";
                break;
            }
        case typeid(float):
            {
                std::cout << "FLOAT";
                break;
            }
        case typeid(double):
            {
                std::cout << "DOUBLE";
                break;
            }
        default:
            {
                std::cout << "OTHER";
                break;
            };
        }
    }
};

И я хочу создать вектор с различными типами этого struct и после просто использовать цикл for, чтобы перебрать все мои элементы и вызвать эту функцию из всех них.

То, что я хотел бы иметь, будет примерно таким:

typedef boost::variant<TemplateTest<float>(), TemplateTest<double>(), TemplateTest<int>() > variant;
typedef std::vector<variant> TestVar;
TestVar d;
d.push_back(new TemplateTest<float>());
d.push_back(new TemplateTest<double>());
d.push_back(new TemplateTest<int>());
for (auto value : d)
{
    value.test(5);
}

Есть ли способ сделать это без использования конкретного приведения моего типа перед вызовом функции?

1 Ответ

0 голосов
/ 30 августа 2018

Если вы хотите, чтобы одна функция выполняла разные функции для фиксированного числа типов, вы хотите использовать перегруженные функции, а не шаблоны.

void test(int)
{
   std::cout << "INT";
}

Если у вас есть нормальное значение по умолчанию, которое работает более чем с одним типом, вы можете использовать специализацию шаблонов. У вас уже есть шаблон структуры, обертывающий функции, , что, как правило, хорошая идея .

template <typename T>
struct TemplateTest
{
    void test(T a)
    {
        std::cout << "OTHER";
    }
};

template<>
struct TemplateTest<int>
{
    void test(int a)
    {
        std::cout << "INT";
    }
};

Если, как в этом очень специфическом случае упрощения, все, что отличается, - это строка, вы можете использовать переменные шаблоны:

template<typename T>
constexpr char* Typename = "DEFAULT";

template<>
constexpr char* Typename<int> = "INT";

template <typename T>
struct TemplateTest
{
    void test(T a)
    {
        std::cout << Typename<T>;
    }
};

Живой пример последнего здесь . Вы видите, что, вероятно, хотели, чтобы функция test была static.

...