gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:33:50 25 4
gpt4 key购买 nike

所以我想做的就是这样。

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

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 创建一个 vector ,然后使用 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

关于C++ 模板访问具有不同类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52093693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com