模板专业化与在模板参数类型上使用if else

时间:2018-06-25 05:55:48

标签: c++ templates typetraits

假设我们有一个模板化函数,其中一小部分代码取决于模板参数类型。从设计POV(或从任何角度来看),哪个更好!是否使用其他方式通过使用type_traits(我们可以使用is_same)或模板特殊化(可以将一小部分放在另一个可以特殊化的函数中)检查参数类型?

template <typename T>
void func(T log) {
    // common part

    // part dependent on T. We can put this in a separate function which we can specialize.
    // or we can do:
    // if (std::is_same<T, type1>::value) {
    //    //code1;
    // } else if (std::is_same<T, type2>::value) {
    //    //code2;
    // } else {
    //    //generic code;
    // }

    // common part
}

1 个答案:

答案 0 :(得分:1)

使用运行时if是一个坏主意,因为已知所有内容都可以编译时间。这正是您提到的c ++引入constexpr if的原因。 constexpr if需要兼容c ++ 17的编译器,在2018年应该是这种情况:-)

template <typename T>
void func(T ) {
    std::cout << "common before" << std::endl;

     if constexpr (std::is_same<T, int>::value) {
         std::cout << "int" << std::endl;
     } else if constexpr (std::is_same<T, double>::value) {
         std::cout << "double" << std::endl;
     } else {
         std::cout << "other" << std::endl;
     }

     std::cout << "common after" << std::endl;
}

int main()
{
    func(1);
    func(1.1);
    func('a');
}

但是有一点需要提一下:如果模板化函数中有很大的“通用”部分,那么无论模板专业化还是constexpr if都没关系,您将获得该代码的完整副本每个模板实例。因此,最好将该代码移至一个函数,以仅获得一次通用部分。如果编译器认为内联该代码是一个不错的选择,它将做到这一点,并且您将获得两种解决方案的精华。