c++ - 使用指令和部分特化

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

我有一个模板化接口(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>::faaX<void>::faa互不干扰。

关于c++ - 使用指令和部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47727788/

相关文章:

C++ 为什么在我的类中添加析构函数会使我的类无法 move ?

c++ - 如何使用 cmake 正确链接库(.so y .a)

c++ - 如何在一组迭代器上调用 `find`,通过迭代器指向的内容进行查找?

c++ - 使用 C++17 扩展 using 声明的问题

c++ - 部分模板成员特化

language-agnostic - 支持 "partial specialization"的其他语言有哪些?

c++ - 如何使用 vector 打印值以及如何将值添加到数组的末尾?

c++ - 提取满足条件的最大连接子 vector

c++ - 如何为模板的内部类型专门化一个类?

c++ - 什么是相对顺序以及 stable_partition 的作用是什么?