如何使用decltype来确定加法的结果
How to use decltype to determine the result of an addition
使用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)
不是这样工作的。我有什么办法可以做到这一点吗?
使用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
返回一个右值引用,并且只在未求值的上下文中工作,而decltype
恰好是。
如果你的编译器不支持这个标准,使用这个指针技巧(它也只适用于未求值的上下文中):
-> Matrix<decltype(*(ValueType*)(0) + *(CompatibleType*)(0))>
// or
-> Matrix<decltype(*static_cast<ValueType*>(0) +
*static_cast<CompatibleType*>(0))>
您可以使用std::declval
:
decltype(std::declval<A>()+std::declval<B>))
你需要/想要std::declval
:
decltype(std::declval<ValueType>()+std::declval<CompatibleType>());
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>
。这就是所谓的鸭子类型,这就是为什么应该使用与函数体实际使用的相同的访问器函数。
有点晚了,但是假设ValueType
和CompatibleType
是POD类型或其他具有公共无参数构造函数的类(对于您的用例可能是一个有效的假设),您可以构造这些类型。所以
decltype(ValueType+CompatibleType)
不工作(如你所写),但
decltype(ValueType() + CompatibleType())
可以,而且没有运行时开销(来源:这里)。在这种情况下,您不需要std::declval
。
证明:
相关文章:
- 使用QProcess执行命令,并将结果存储在QStringList中
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在递归中使用循环会产生意想不到的结果?
- 警告 C4552:">>":未使用表达式的结果
- 在运行时使用范围更新结果
- 使用 find 解析文件会给出不同文件的奇怪结果
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 如果一个字符,比如说"9",我减去"0",我在结果上使用 is 数字,我是真还是假
- 尝试在Windows结果上使用GLOG未定义的参考
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- sizeof(…)运算符结果的使用令人困惑
- 正弦结果取决于使用的C++编译器
- 表达式结果未使用,图像生成
- 警告:表达式结果未使用
- 在C++11中,未排序的修改警告变为结果未使用的警告
- 浮点计算给出的结果与使用双精度计算的结果不同
- 我可以在函数的结果上使用std::move来构造一个新对象吗
- libpcap 数据包结果与使用 C++ 的 BSD 套接字接收数据之间的差异