部分专用化和静态成员
Partial specialization and static member
>我有以下内容:
template<typename T, bool is_derived = false>
struct A
{
T v_;
static const char* getMehStatic();
virtual const char* getMeh() const { return getMehStatic(); }
};
template<typename T>
struct A<std::vector<T>> : public A<std::vector<T>, true>
{
static const char* getMehStatic();
};
template<typename T>
const char* A<std::vector<T>>::getMehStatic() { return "vector"; }
int main()
{
A<std::vector<int>> a;
std::cout << a.getMeh();
}
当我编译它时,链接器抱怨它找不到getMehStatic();
这是因为它寻找泛型类型的类型。换句话说,它似乎跳过了我提供部分专用A<std::vector<T>>
实现的尝试。
我从泛型版本派生我的专用类,使用默认参数选择正确的类,否则专用类将从自身派生。
我已经尝试了各种各样的事情 - 防止使用enable_if<>
生成通用版本中的getMehStatic()
,进行专业化的各种方法,没有一种工作(根据我尝试的内容,我有几种不同的错误消息,所以可能不是很有帮助在这里发布它们)。那么,如何部分专用化静态成员函数,使专用函数覆盖泛型类中的函数?
缺少A<std::vector<T>, true>::getMehStatic()
的定义。不幸的是,您无法对其进行部分专业化。您可以提供通用定义:
template<typename T, bool is_derived>
const char* A<T, is_derived>::getMehStatic() { return "generic"; }
演示
但是由于A<std::vector<T>>
不覆盖getMeh()
,所以调用的是泛型方法。
CRTP确实可以解决这个问题:
template<typename T, typename Derived>
struct A
{
T v_;
const char* getMeh() const { return Derived::getMehStatic(); }
};
struct B : A<std::vector<int>, B>
{
static const char* getMehStatic() { return "vector"; }
};
演示
那么,如何部分专用化静态成员函数,使专用函数覆盖泛型类中的函数?
通过 CRTP,类似
template<typename T, typename Derived = void>
struct A
{
T v_;
static const char* getMehStatic();
virtual const char* getMeh() const {
if constexpr( std::is_same_v<Derived,void> )
return getMehStatic();
else
return Derived::getMehStatic();
}
};
template<typename T>
struct A<std::vector<T>> : public A<std::vector<T>, A<std::vector<T>> >
{
static const char* getMehStatic();
};
template<typename T, typename Derived>
const char* A<T,Derived>::getMehStatic() { return "generic"; }
template<typename T>
const char* A<std::vector<T>>::getMehStatic() { return "vector"; }
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- 如何从具有专用化的类模板定义静态成员变量?
- 类型为专用数据成员的静态成员
- 部分专用化和静态成员
- 模板专用化和静态成员初始化
- 模板的非静态成员可以专用于数据或函数吗
- 模板化子类和模板化基类的静态成员专用化
- 基于静态成员类型的模板函数专用化
- 模板类的静态成员,除非显式专用化,否则不会实例化
- 在嵌套模板专用化期间初始化嵌套模板类的静态成员
- 将此指针推回专用静态成员向量
- 导出/定义静态模板专用成员变量C++
- 无法引用专用静态成员变量:编译器错误
- 完全专用模板的constexpr静态成员在CLang上的动态链接失败