使用指令和部分专用化

Using directive and Partial Specialization

提问人:Svalorzen 提问时间:12/9/2017 最后编辑:iBugSvalorzen 更新时间:12/9/2017 访问量:103

问:

我有一个模板化的接口类,有几个实现的方法和几个虚拟方法。

我需要专门化它才能修改某些方法的签名,但其他方法将保持不变。

有没有办法通过指令、直接调用或以其他方式将保持不变的方法从原始模板中带回,或者我必须将每个方法复制/粘贴回专用化中?using

template <typename T>
struct X {
    void faa(T t) const { std::cout << t << '\n'; }
    void foo() const { std::cout << "foo\n"; }
};

template <>
struct X<void> {
    void faa() const { std::cout << "none\n"; }

    // Something along these lines
    // using X<T>::foo;
    // void foo() const { X<T>::foo(); }
};
C++ C++17 部分专用化 using 指令

评论


答:

4赞 iBug 12/9/2017 #1

似乎是这样。您不能使用指令将函数与不同的签名一起获取。有一种更好的解决方法,而不是将所有内容从模板复制到专业化。您可以使用“公共基类”。Xusing

template <typename T>
struct X_base {
    void foo() const { std::cout << "foo\n"; }
};

template <typename T>
struct X : public X_base<T> {
    void faa(T t) const { std::cout << t << '\n'; }
};

template <>
struct X<void> : public X_base<void> {
    void faa() const { std::cout << "none\n"; }
};

这样,就像 一样,而 和 不会相互干扰。X<void>::fooX_base<void>::fooX<T>::faaX<void>::faa