lac*_*lan 8 c++ templates class return-type c++11
如何获得两种不同类型的乘积的结果类型,即
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;
}
};
Run Code Online (Sandbox Code Playgroud)
我知道在C ++中将两个不同类型的数值相乘是完全有效的,这将给出编译器已知的类型的值。即将a double
和an 相乘int
将得到double
类型答案。
这样,在编译时知道类型的模板类中,应该可以确定将要创建的类型。实际上,可以创建一个lambda来返回该值的结果,即
auto foo = [](int a, float b){ return a * b;}
auto c = foo( 13, 42.0 );
Run Code Online (Sandbox Code Playgroud)
这将导致c
成为float
。
请注意,我仅限于只能使用c ++ 11或更低版本的功能。
Jer*_*man 13
您可以使用decltype
以下方法:
using result_type = decltype(std::declval<TA&>() * std::declval<TB&>())
Run Code Online (Sandbox Code Playgroud)
Nat*_*ica 10
您可以使用decltype
和std::declval
。 decltype
会为您提供表达式的类型,并std::declval
会为您“创建”该类型的对象,即使它不能/您不知道如何构造它也是如此。那给你像
using result_type = decltype(std::declval<TA&>() * std::declval<TB&>());
Run Code Online (Sandbox Code Playgroud)
请注意,我正在为该类型使用左值引用。这样做是因为默认情况下decval
会为您提供右值引用,这可能会为您提供不同的类型。
除了其他答案之外,如果您不需要 供result_type
以后使用,而只是指定 的返回类型,还有另一种方法,即不在c++11中operator()
定义别名 for 。result_type
template< typename TA, typename TB>
struct multiplier
{
auto operator()(TA a, TB b) const -> decltype(a * b)
// ^^^^^ ^^^^^^^^^^^^^^^^^^^
{
return a * b;
}
};
Run Code Online (Sandbox Code Playgroud)
(看网上直播)