仅专门化类模板的一种方法

时间:2020-05-27 17:21:01

标签: c++ c++11 templates template-specialization

我有一个适用于所有可能的类型T1,T2的类模板。

template <typename T1, typename T2>
class Basic {
    int a;
    float b;

public:
    void foo(T1 t1, T2 t2) {
        // use a, b, t1, t2
    }
};

但是,在一种情况下,T2char,我希望foo的行为有所不同。

因此,我尝试仅专门化 该方法:

template <typename T1>
class Basic<T1, char> {
    void foo(T1 t1, char t2) {
        // try using a, b, t1, t2 in a very special way

        // ERROR:
        // use of undeclared identifier: a
        // use of undeclared identifier: b
    }
};

问题是,模板类Basic中可能存在许多不同的数据成员和方法,这些数据成员和方法不一定与功能foo有关。

话虽这么说,我觉得全班专业将是a肿的。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

fooT2时,您可以使用std::is_samechar中执行其他操作:

void foo(T1 t1, T2 t2) {
   if (std::is_same<T2, char>::value)
     std::cout << "char";
   else
     std::cout << "not char";
}

您不需要Basic的完全专业化,甚至不需要foo的专业化。

这里是demo

从c ++ 17开始,您甚至可以避免编译不需要的分支(即,仅当charT2时编译char分支,反之亦然) ,使用if constexpr,如下所示:

if constexpr (std::is_same<T2, char>())

这里是demo

答案 1 :(得分:1)

您可以使用std::is_same<T2, char>进行分支,例如if (std::is_same<T2, char>::value),也可以使用标记分派,如下所示:

public:
    void foo(T1 t1, T2 t2) {
        foo_impl(t1, t2, std::is_same<T2, char>{});
    }

private:
    void foo_impl(T1 t1, T2 t2, std::false_type) {
        std::cout << "T2 != char\n";
    }

    void foo_impl(T1 t1, T2 t2, std::true_type) {
        std::cout << "T2 == char\n";
    }

Demo