laz*_*zug 5 c++ templates type-traits
我定义了一个模板类 ( DataArray<T>),并且想要定义一个函数来计算整型数组 ( 、、... ) 或复杂类型数组 ( 、 、 ... )min()的最小值。doublefloatintstd::complex<double>std::complex<float>
我正在尝试使用类型特征来选择正确的函数。尽管这里的讨论非常精彩,但我的代码无法编译:
Run Code Online (Sandbox Code Playgroud)DataArray<double> and DataArray<std::complex<double>>: no matching overloaded function
问题是什么?这是我的代码的最小部分:
#include <iostream>
#include <vector>
#include <complex>
#include <type_traits>
template <typename T>
class DataArray {
public:
DataArray(T * data) : m_data(data) {}
template<typename T>
using isComplex = std::is_same<T, std::complex<typename T::value_type>>;
template <typename T>
typename std::enable_if<isComplex<T>::value>::type min() {
std::cout << "Min for complex" << std::endl;
}
template <typename T>
typename std::enable_if<std::is_arithmetic<T>::value>::type min() {
std::cout << "Min for arithmetic values." << std::endl;
}
private:
T * m_data;
};
int main()
{
double v1[2] ={ 1., 2.};
DataArray<double> d1(v1);
d1.min(); // min function for double : **compilation error**
std::complex<double> v2[2] = { { 1, 2 },{ 3, 4 } };
DataArray<std::complex<double>> d2(v2);
d2.min(); // min function for complex<double> : compilation error
}
Run Code Online (Sandbox Code Playgroud)
成员模板的模板参数T隐藏类模板的模板参数T。给他们另外一个名字;并为 的模板参数指定默认值min(),否则无法推导。例如
template<typename X>
using isComplex = std::is_same<X, std::complex<typename X::value_type>>;
template <typename X = T>
typename std::enable_if<isComplex<X>::value>::type min() {
std::cout << "Min for complex" << std::endl;
}
template <typename X = T>
typename std::enable_if<std::is_arithmetic<X>::value>::type min() {
std::cout << "Min for arithmetic values." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)