我有一个模板化的接口类,有几个实现的方法和几个虚拟的方法。
我需要专门化它以修改某些方法的签名,但其他方法将保持不变。
有没有办法通过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(); }
};
答案 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>::faa
和X<void>::faa
则不会互相干扰。