提问人:Svalorzen 提问时间:12/9/2017 最后编辑:iBugSvalorzen 更新时间:12/9/2017 访问量:103
使用指令和部分专用化
Using directive and Partial Specialization
问:
我有一个模板化的接口类,有几个实现的方法和几个虚拟方法。
我需要专门化它才能修改某些方法的签名,但其他方法将保持不变。
有没有办法通过指令、直接调用或以其他方式将保持不变的方法从原始模板中带回,或者我必须将每个方法复制/粘贴回专用化中?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(); }
};
答:
4赞
iBug
12/9/2017
#1
似乎是这样。您不能使用指令将函数与不同的签名一起获取。有一种更好的解决方法,而不是将所有内容从模板复制到专业化。您可以使用“公共基类”。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
评论