我有一个模板化接口(interface)类,带有几个实现的方法和几个虚拟方法。
我需要对其进行专门化,以便修改某些方法的签名,但其他方法将保持不变。
有没有办法通过 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(); }
};
最佳答案
看来是这样。无法获取X
中的函数使用 using
具有不同的签名指令。有一个比将模板中的所有内容复制到特化更好的解决方法。您可以使用“公共(public)基类”。
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
互不干扰。
关于c++ - 使用指令和部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47727788/