c++ - 让模板部分特化与通用实例化共享成员函数

标签 c++ c++11

假设我有一个类模板 Foo :

template<typename T, typename U>
struct Foo {
    ~Foo() = default;

    // I want to reuse these methods for all instantiations of Foo
    void bar() {}
    void poi() {}
};

我想将析构函数专门用于任何 Foo<T, int> ,但我想要Foo<T, int>与一般实例化共享其他成员函数。但如果我尝试这样做:

template<typename T>
Foo<T, int>::~Foo()
{}

在类之外,它无法编译,错误是“无效使用不完整类型struct Foo<T, int>”。这个错误是什么意思,我怎样才能实现我想要做的事情?

最佳答案

不可能部分特化(非模板化)成员函数。你需要让整个类(class)变得特化。

实现您想要的功能的一种方法是继承通用函数。

template<typename T, typename U> struct MemberProvider
{
      ~MemberProvider() = default;

      void bar() {};
      void poi() {};
};


template<typename T, typename U>
struct Foo : public MemberProvider<T, U>
{
    ~Foo() = default;

// Optionally, you can still do this.
//    However, note that these HIDE the inherited functions

    void bar() {};
    void poi() {};
};

template<typename T> struct Foo<T, int> : public MemberProvider<T, int>
{
    ~Foo() {};
};

请注意,您还需要包含继承类中的公共(public)函数所作用的任何成员。

但是,我认为上面的代码代表了一种代码味道。如果我在生产环境中看到类似上面的代码,我会考虑是否存在设计缺陷。请记住,当析构这样的类时,最派生的析构函数会在基类析构函数之前调用。 MemberProvider 也不是多态基础。

关于c++ - 让模板部分特化与通用实例化共享成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38446841/

相关文章:

c++ - 如何转储 DSA_SIG 或 RSA_SIG

c++ - 在几何中使用 boost rtree 查找结果点

c++ - 按值获取枚举关键字

c++ - 当我使用自定义分配器溢出 vector 时,为什么没有出现段错误?

linux - 在树莓派上使用 libboost 进行编译 - 未定义对 `boost::system::system_category() 的引用

c++ - 如何使用c++11/14来简化这个实现

c++ - 通过 SOCKS5 c++ 发送和接收

c++ - 如何在 C++ 中返回函数类型以外的数据类型?

c++ - 为什么 std::unique_ptr 比标准指针慢得多……在优化之前?

c++ - 类模板中文字运算符的Friend声明