C++ 模板访问具有不同类型的函数

C++ Templates access a function with different types

所以我想做的就是这样。

我有一个像这样的模板结构:

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);
}

有没有办法在我的函数调用之前不使用我的类型的特定转换来做到这一点?

如果您希望单个函数为固定数量的类型执行不同的操作,您希望使用重载函数,而不是模板。

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

如果您有适用于多种类型的合理默认设置,则可以使用模板专业化。您已经有了一个包装函数的结构模板,which is generally a good idea

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>;
    }
};

最后一个实例here。您看到您可能希望 test 函数为 static.