如何overload/specialize模板class函数来处理算术类型和容器-class
How to overload/specialize template class function to handle arithmetic types and a container-class
我正在尝试创建一个模板 class,其中包含一个可以处理算术数据类型(int、char、float ...)的成员函数和一个容器-class,例如 Eigen::DenseBase <> 或 std::vector<>
演示我的想法的代码:
template <typename T>class myClass{
...
void foo(T);
...
};
template <typename T> void myClass<T>::foo(T){
//Function for arithmetic Datatypes
}
//Specialization does not work - What is the correct (best?) approach?
template <> void myClass<T>::foo(<Eigen::DenseBase<T>){
//Function for Eigen::DenseBase<T> - Objects
}
这是我使用模板编程的第一步,所以我期待着解决这个问题的提示和想法
您正在尝试做的是所谓的部分专业化。您正在尝试 专门化 您的 foo
以不同的方式处理一系列类型 - 即作为 Eigen::DenseBase
实例的类型。不幸的是,这是不可能的。
模板 classes 的成员函数只能是完全专用的,即可以为特定类型提供实现。例如,这会起作用:
template <>
void myClass<char*>::foo(char* );
部分特化 foo 的唯一方法是将其置于整个 class 的部分特化中。类似的东西:
template <typename T>
class myClass{
...
void foo(T);
...
};
template<class T>
class myClass<Eigen::DenseBase<T>> {
void foo(Eigen::DenseBase<T> ) { ...}
};
这里需要注意的是,如果您(部分)专门化 class,您需要提供原始模板中需要的所有成员(通常有很多副本)。这里的标准解决方案是将不依赖于部分特化的所有内容都放在基础 class 中,并从中继承您的模板和特化。
我正在尝试创建一个模板 class,其中包含一个可以处理算术数据类型(int、char、float ...)的成员函数和一个容器-class,例如 Eigen::DenseBase <> 或 std::vector<>
演示我的想法的代码:
template <typename T>class myClass{
...
void foo(T);
...
};
template <typename T> void myClass<T>::foo(T){
//Function for arithmetic Datatypes
}
//Specialization does not work - What is the correct (best?) approach?
template <> void myClass<T>::foo(<Eigen::DenseBase<T>){
//Function for Eigen::DenseBase<T> - Objects
}
这是我使用模板编程的第一步,所以我期待着解决这个问题的提示和想法
您正在尝试做的是所谓的部分专业化。您正在尝试 专门化 您的 foo
以不同的方式处理一系列类型 - 即作为 Eigen::DenseBase
实例的类型。不幸的是,这是不可能的。
模板 classes 的成员函数只能是完全专用的,即可以为特定类型提供实现。例如,这会起作用:
template <>
void myClass<char*>::foo(char* );
部分特化 foo 的唯一方法是将其置于整个 class 的部分特化中。类似的东西:
template <typename T>
class myClass{
...
void foo(T);
...
};
template<class T>
class myClass<Eigen::DenseBase<T>> {
void foo(Eigen::DenseBase<T> ) { ...}
};
这里需要注意的是,如果您(部分)专门化 class,您需要提供原始模板中需要的所有成员(通常有很多副本)。这里的标准解决方案是将不依赖于部分特化的所有内容都放在基础 class 中,并从中继承您的模板和特化。