假设我有一个类模板 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/