使用指令和部分专业化

时间:2017-12-09 10:54:51

标签: c++ c++17 partial-specialization using-directives

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

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

有没有办法通过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(); }
};

1 个答案:

答案 0 :(得分:4)

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

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>::foo的行为就像X_base<void>::foo,而X<T>::faaX<void>::faa则不会互相干扰。