我想根据类型调用模板化函数中的不同函数,如下所示:
template<typename T>
T func() {
static_assert(std::is_same<T, int>::value || /* other allowed types */ , "Type not allowed");
T ret {};
// if T == int
funcInt(&ret);
// if T == /* other types */
/* other functions */
}
这样的事情可能吗?
我试过了:
std::function< int(*T)> query;
if (std::is_same<T, int>::value) {
query = funcInt;
}
但这给了我一个错误:
错误:'T'没有引用值
答案 0 :(得分:5)
is_same
可以在if
语句中使用:
if (std::is_same<T, int>::value>) { /* stuff */ }
if (std::is_same<T, float>::value) { /* other stuff */ }
理论上这个检查在理论上是在运行时完成的,编译器在编译时知道所有值,并且很可能会删除任何死的分支。缺点是func
中的整个代码需要语法和形式良好,无论T
是什么。这可能并不总是可行的。
正确的模板方式是这样的:
template<typename>
struct helper;
template<>
struct helper<int> { static void do_work() { /* stuff */ } };
template<typename T>
T func()
{
static_assert(std::is_same<T, int>::value || /* other allowed types */ , "Type not allowed");
helper<T>::do_work();
}
这允许您在func
中编写常见内容,并将其余内容放在专门化中。
OTOH,如果func
的签名真的很简单并且不会有很多代码重复,那么你也可以专注于func
本身。