使用在C ++中作为模板传递的类型

时间:2010-03-16 21:43:20

标签: c++ templates

是否可以实际使用作为控制流模板传递的类型?我想编写一个使用模板的函数,模板又根据传递的类型调用另一个函数:

template <class T> void test_function (T var)
{
    //Do stuff
    if (T == char) {
        bar (var);
    } else {
        foo (var);
    }
    //Do even more stuff
}

如果没有,我将不得不回到枚举......

编辑: 到目前为止,所有答案都建议我使用模板专业化。我不是很具体,但这与完全不使用模板是一样的,因为对于每种不同的类型,都有一个不同的函数调用。

5 个答案:

答案 0 :(得分:6)

您通常会使用专业化:

template<class T> void forward(T t) {
    // ...
}

template<> void forward<char>(char c) {
    // ...
}

template<class T> void test(T t) {
    forward<T>(t);
}

这为您提供了有效的“编译时分支”

答案 1 :(得分:4)

可能这样做,但这样做几乎绝不是一个好主意。更好的想法是分解公共位并为这些特定类型的函数提供重载,例如

template <class T> void test_function_prologue (T var)
{
    //Do stuff
}

template <class T> void test_function_epilogue (T var)
{
    //Do even more stuff
}

template <class T> void test_function (T var)
{
    test_function_prologue(var);
    foo (var);
    test_function_epilogue(var);
}

void test_function (char var)
{
    test_function_prologue(var);
    bar (var);
    test_function_epilogue(var);
}

答案 2 :(得分:2)

只要foo()接受 char 类型的参数,bar()接受任何T,就有可能。否则不是。即使从未采用过一个分支,对于任何用实例化模板的T都必须编译两个分支。如果两个分支都不能编译任何T,那么除了使用编译时分支(在任何情况下都是可取的)之外别无选择。

否则您可能会使用运行时类型标识:

if (typeid(T) == typeid(char))

或编译时检查:

if (boost::is_same<T, char>::value)

其中is_same可以实现为

template <class T, class U>
struct is_same { static const bool value = false; };

template <class T>
struct is_same<T, T> { static const bool value = true; };

答案 3 :(得分:1)

您可以使用模板专业化。 这意味着您可以为泛型定义不同的实现 void test_function(T)和特定的void test_function(char)

答案 4 :(得分:1)

即使您已编辑的回复,我仍会建议模板专业化。您只需创建一个调用所需函数的代理函数:

template <class T> void call_other_function(T var)
{
   foo(var);
}

template <> void call_other_function<char>(char var)
{
   bar(var);
}

template <class T> void test_function (T var)
{
    //Do stuff
    call_other_function(var);
    //Do even more stuff
}