C ++中的Decltype表达式类型推导

时间:2017-08-08 22:34:09

标签: c++ visual-c++

我正在尝试在c ++上创建简单的数学。我想使用带有epsilon的自定义浮点类型,它在编译时计算。所以我需要创建类型扣除操作。 我的代码存在问题:

namespace Math {    
namespace Internal {
    template<typename typeT>
    struct type_value {
        static typeT value_;
    };


template<typename type1T, typename type2T, size_t length>
struct dot_product_type_deducator {
    using value_type =
    decltype(
        (type_value<dot_product_type_deducator<type1T, type2T, length - 1>>::value_)
        + (type_value<dot_product_type_deducator<type1T, type2T, 1>>::value_));
};

template<typename type1T, typename type2T>
struct dot_product_type_deducator<type1T, type2T, 1> {
    using value_type = decltype(type_value<type1T>::value_ * type_value<type2T>::value_);
};
}

template<typename type1T, typename type2T, size_t length>
static auto dot(const Vector<type1T, length> &vector1,
                const Vector<type2T, length> &vector2) {
    return std::inner_product(vector1.begin(), vector1.end(), vector2.begin(),
        static_cast<typename Internal::dot_product_type_deducator<type1T, type2T, length>::value_type>(0));
}

}

当我写:

dot(Vector<int, 3>{1, 2, 3}, Vector<float, 3>{2, 3, 4})

MSVC说:

error C2676: binary '+': Math::Internal::dot_product_type_deducator<type1T,type2T,1>' does not define this operator or a conversion to a type acceptable to the predefined operator
1>          with
1>          [
1>              type1T=int,
1>              type2T=float
1>          ]

还有两个错误。

答案:

我忘了写dot_product_type_deducator::value_type

1 个答案:

答案 0 :(得分:0)

当你这样做时

using value_type =
  decltype(
      (type_value<dot_product_type_deducator<type1T, type2T, length - 1>>::value_)
      + (type_value<dot_product_type_deducator<type1T, type2T, 1>>::value_));

您将value_type设置为您指定的类型。现在,type_value<...>::value看起来与std::declval非常相似,这意味着您的value_type将等于dot_product_type_deducatoroperator+相加的结果。但我们可以清楚地看到dot_product_type_deducator结构,我们可以看到它没有定义operator+,因此错误。

我不知道您正在尝试使用这些结构做什么,但如果您希望编译代码,则需要在operator+上定义dot_product_type_deducator