如何以编程方式调用具有不同数据类型的C ++模板函数?

时间:2011-12-29 14:28:55

标签: c++ templates

在我的C ++程序中,我需要调用具有不同数据类型的模板化函数(intfloatdoublechar等)并运行方法{ {1}},bar1()

如何在不必为每种类型显式写入调用的情况下执行此操作?

bar2()

5 个答案:

答案 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,一个类型的容器。创建一个递归函数,它将类型向量作为模板参数(或这样一个向量的迭代器),然后在每个后续调用中沿着迭代器传递给下一个类型。