如何获得将两种不同类型的相乘的结果类型?
How to get resultant type of multiplying two different types?
如何获得将两种不同类型相乘的结果类型,即
template< typename TA, typename TB>
struct multiplier
{
using result_type = // something here finds result of TA * TB
result_type operator()( TA a, TB b ) const
{
return a * b;
}
};
我知道C++将两个不同类型的数值相乘是完全有效的,这将给出编译器已知的类型的值。 即,将double
和int
相乘将得到double
类型的答案。
因此,在编译时类型已知的模板类中,应该可以确定将要创建的类型。 实际上,可以创建一个lambda来返回该值的结果,即
auto foo = [](int a, float b){ return a * b;}
auto c = foo( 13, 42.0 );
这将导致c
成为float
。
请注意,我只能使用 c++11 或更低版本的功能。
您可以使用decltype
来执行此操作:
using result_type = decltype(std::declval<TA&>() * std::declval<TB&>());
您可以使用decltype
和std::declval
。decltype
会给你一个表达式的类型,std::declval
会为你"创建"一个类型的对象,即使它不能/你不知道如何构造它。 这给了你类似的东西
using result_type = decltype(std::declval<TA&>() * std::declval<TB&>());
请注意,我正在为该类型使用左值引用。 这样做是因为默认情况下decval
会给你一个右值引用,这可能会给你一个不同的类型。
除了其他答案之外,如果您不需要result_type
供以后使用,而只是指定operator()
的返回类型,还有另一种方法,即不在 c++11 中定义result_type
的别名。
您可以提供尾随返回类型以及auto
返回,如下所示:
template< typename TA, typename TB>
struct multiplier
{
auto operator()(TA a, TB b) const -> decltype(a * b)
// ^^^^^ ^^^^^^^^^^^^^^^^^^^
{
return a * b;
}
};
(在线观看直播)
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- C++ 模板结果类型
- C++,概念不适用于无符号整数作为结果类型?
- std::chrono::duration::count函数的实际结果类型是什么
- 设计自己的结果/两者之一:是否应该始终指定成功类型和错误类型
- 如何获得将两种不同类型的相乘的结果类型?
- 为什么 std::when_any 使用 std::tuple 而不是 std::vector 作为其结果类型?
- 什么是在C 中存储结果INT*的最佳数据类型
- 在不同类型的向量上使用 std::remove 的不同结果
- boost::variant 当 bool 显示为可能的类型时,会给出错误的结果
- libclang 为类型限定符给出错误的结果
- VIM:执行复杂文件类型的脚本和显示结果
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 使用枚举确定返回结果的类型(使用宏的黑客)
- 根据运算符推断模板返回类型:结果
- 类型结果之间的意外差异