【问题标题】:How to write a type trait method如何编写类型特征方法
【发布时间】:2018-11-26 15:15:21
【问题描述】:

我定义了一个模板类 (DataArray<T>),我想定义一个 min() 函数来计算整数类型数组的最小值 (double, float, int, ...) 或复杂类型数组 (std::complex<double>, std::complex<float>, ...)。

我正在尝试使用类型特征来选择正确的功能。尽管here 进行了精彩的讨论,但我的代码无法编译:

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 
}

【问题讨论】:

  • 只是好奇,你如何为复合体实现 min?
  • 和 Matlab 一样。复数向量的 min 函数返回可以使用以下代码计算的具有最小量值的元素: template typename std::enable_if::value>::type min() { std::cout

标签: c++ templates typetraits


【解决方案1】:

成员模板的模板参数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;
}

LIVE

【讨论】:

  • 哦,是的,我很愚蠢。非常感谢宋元瑶的帮助。
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多