根据类型调用不同的功能

时间:2014-10-10 07:53:25

标签: c++ templates conditional

我想根据类型调用模板化函数中的不同函数,如下所示:

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'没有引用值

1 个答案:

答案 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本身。