如何使用decltype来确定添加的结果

时间:2013-06-09 20:02:50

标签: c++ c++11 decltype

使用decltype我可以执行以下操作:

template <typename T1, typename T2>
auto sum(T1 const & t1, T2 const & T2)
-> decltype(t1+t2)
{ /* ... */ }

但是,在我的情况下,我需要找出添加的类型,而不需要T1T2类型的实例。具体地:

template <typename ValueType>
class Matrix
{
    /* ... */
    public:
        template <typename CompatibleType>
        auto operator+(Matrix<CompatibleType> const & other)
        -> Matrix<decltype(ValueType+CompatibleType)>
        { /* ... */ }
};

当然,decltype(ValueType+CompatibleType)不会以这种方式运作。有什么方法可以实现这个目标吗?

5 个答案:

答案 0 :(得分:10)

使用std::declval<T>();(C ++ 11):

#include <utility>

template <typename CompatibleType>
 auto operator+(Matrix<CompatibleType> const & other)
  -> Matrix<decltype(std::declval<ValueType>() + std::declval<CompatibleType>())>
    { /* ... */ }

std::declval返回一个rvalue-reference,只会在decltype恰好出现的未评估上下文中工作。

如果您的编译器不支持此标准,请使用此指针技巧(这也仅适用于未评估的上下文):

-> Matrix<decltype(*(ValueType*)(0) + *(CompatibleType*)(0))>
// or
-> Matrix<decltype(*static_cast<ValueType*>(0) +
                   *static_cast<CompatibleType*>(0))>

答案 1 :(得分:6)

您可以使用std::declval

decltype(std::declval<A>()+std::declval<B>))

答案 2 :(得分:6)

您需要/ std::declval

decltype(std::declval<ValueType>()+std::declval<CompatibleType>());

答案 3 :(得分:0)

std::declval有效,但有一个更简单的答案隐藏在......内 - 真正的元素访问!

假设您的Matrix班级有一个at函数,例如std::vector,您可以写

template<typename M>
auto operator+(M const & other)
     -> Matrix<decltype(this->at(0,0) + other.at(0,0))>

否则,将at替换为operator+正文中使用的正确函数名称以访问各个元素。

这样做的另一个好处是适用于提供所需访问者功能的任何other参数,它不必是另一个Matrix<T> 。这就是所谓的 duck typing ,这就是为什么你应该使用你的函数体实际使用的相同的访问器函数。

答案 4 :(得分:0)

派对有点迟,但假设ValueTypeCompatibleType是POD类型或其他具有公共参数构造函数的类(可能是您的用例的有效假设),可以只构建那些类型。所以

decltype(ValueType+CompatibleType)

不起作用(正如你所写)但是

decltype(ValueType() + CompatibleType())

确实没有运行时开销(来源:here)。在这种情况下,您不需要std::declval

证明:Here