是否可以实际使用作为控制流模板传递的类型?我想编写一个使用模板的函数,模板又根据传递的类型调用另一个函数:
template <class T> void test_function (T var)
{
//Do stuff
if (T == char) {
bar (var);
} else {
foo (var);
}
//Do even more stuff
}
如果没有,我将不得不回到枚举......
编辑: 到目前为止,所有答案都建议我使用模板专业化。我不是很具体,但这与完全不使用模板是一样的,因为对于每种不同的类型,都有一个不同的函数调用。
答案 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
}