使用decltype
我可以执行以下操作:
template <typename T1, typename T2>
auto sum(T1 const & t1, T2 const & T2)
-> decltype(t1+t2)
{ /* ... */ }
但是,在我的情况下,我需要找出添加的类型,而不需要T1
和T2
类型的实例。具体地:
template <typename ValueType>
class Matrix
{
/* ... */
public:
template <typename CompatibleType>
auto operator+(Matrix<CompatibleType> const & other)
-> Matrix<decltype(ValueType+CompatibleType)>
{ /* ... */ }
};
当然,decltype(ValueType+CompatibleType)
不会以这种方式运作。有什么方法可以实现这个目标吗?
答案 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)