在我的C ++程序中,我需要调用具有不同数据类型的模板化函数(int
,float
,double
,char
等)并运行方法{ {1}},bar1()
。
如何在不必为每种类型显式写入调用的情况下执行此操作?
bar2()
答案 0 :(得分:2)
由于它们在您的示例中是void
函数,您是否可以重写它们以便可以推断出类型?像这样:
template <class T>
void example(const T& v)
{
// do something profound and meaningful here.
foo<T>::bar1();
foo<T>::bar2();
foo<T>::bar3();
}
现在模板类型可以通过传递给函数的参数来推断:
int x = 0;
double y = 0;
bool b = false;
std::string s = "Hello";
example(x);
example(y);
example(b);
example(s);
答案 1 :(得分:1)
您设计这些功能的方式,需要在某种程度上指定类型。他们无法推断出来。
您可以创建单个函数,因此只需要提及一次类型。
template<typename T>
void do_it()
{
foo<T>::bar1()
foo<T>::bar2()
foo<T>::bar3()
}
答案 2 :(得分:1)
我认为如果你使用C ++ 11,这就是你所追求的。但是,不知道如何用C ++ 03做到这一点。
template<typename Type>
void printAll()
{
Foo<Type>::bar1();
Foo<Type>::bar2();
Foo<Type>::bar3();
}
template <typename Type, typename Type2, typename... RestTypes>
void printAll()
{
printAll<Type>();
printAll<Type2, RestTypes...>();
}
int main()
{
printAll<int, double, float, string>();
return 0;
}
答案 3 :(得分:0)
<强>元编程强>
创建一个存储您要测试的所有数据类型的数组。然后,编写一个循环来输出所有函数调用。最后,编译并运行此生成的代码。
string types = ["int", "float", "char", "double"];
for(int j=0; j<4; ++j)
for(int k=0; k<3; ++k)
cout << "foo<" << types[j] << ">::bar" << k+1 << "();" << endl
答案 4 :(得分:0)
一种解决方案是使用TypeLists。看看boost::mpl::vector
,一个类型的容器。创建一个递归函数,它将类型向量作为模板参数(或这样一个向量的迭代器),然后在每个后续调用中沿着迭代器传递给下一个类型。