C++ C++;14成员函数返回类型的转换-简洁版本 请把这看作是我揭露我怀疑的最简单的例子: #include <iostream> #include <stdint.h> #include <typeinfo> using DefaultType = uint32_t; class point { public: DefaultType x( ) const { return DefaultType( 0 ); } DefaultType y( ) const { return DefaultType( 0 ); } }; int main( ) { long cast_me = 0xaaaaaaaa; auto casted = static_cast< std::result_of< decltype( &point::x )( point ) >::type >( cast_me ); std::cout << "cast_me (" << typeid( cast_me ).name( ) << ") has been casted (" << typeid( casted ).name( ) << ")" << std::endl; }

C++ C++;14成员函数返回类型的转换-简洁版本 请把这看作是我揭露我怀疑的最简单的例子: #include <iostream> #include <stdint.h> #include <typeinfo> using DefaultType = uint32_t; class point { public: DefaultType x( ) const { return DefaultType( 0 ); } DefaultType y( ) const { return DefaultType( 0 ); } }; int main( ) { long cast_me = 0xaaaaaaaa; auto casted = static_cast< std::result_of< decltype( &point::x )( point ) >::type >( cast_me ); std::cout << "cast_me (" << typeid( cast_me ).name( ) << ") has been casted (" << typeid( casted ).name( ) << ")" << std::endl; },c++,casting,type-conversion,c++14,C++,Casting,Type Conversion,C++14,非常有效,我的示例程序为我提供了: cast_me (l) has been casted (j) 唯一的问题是,这太冗长了,以至于使一些相当简单的东西变得难以辨认 这是不是一种最好、最简洁的方法,可以在没有任何表现的情况下达到同样的结果,也不会引起任何诠释学的讨论 提前谢谢 您可以这样完全避免的结果: static_cast< decltype(point{}.x()) >( cast_me ) 您可以像这样完全避免的结果: static_cast< decltype(p

非常有效,我的示例程序为我提供了:

cast_me (l) has been casted (j)
唯一的问题是,这太冗长了,以至于使一些相当简单的东西变得难以辨认

这是不是一种最好、最简洁的方法,可以在没有任何表现的情况下达到同样的结果,也不会引起任何诠释学的讨论


提前谢谢

您可以这样完全避免的结果:

static_cast< decltype(point{}.x()) >( cast_me )

您可以像这样完全避免
结果:

static_cast< decltype(point{}.x()) >( cast_me )

维托里奥的解决方案当然是正确的,而且要简洁得多,但坦率地说,typedefs就是为这种事情而设计的:

class point
{
public:
    using ReturnType = DefaultType;
    ReturnType x( ) const  { return ReturnType( 0 ); }
    ReturnType y( ) const  { return ReturnType( 0 ); }
};

auto    casted = static_cast<point::ReturnType>( cast_me );
类点
{
公众:
使用ReturnType=DefaultType;
ReturnType x()常量{ReturnType(0);}
ReturnType y()常量{ReturnType(0);}
};
自动铸造=静态铸造(铸造);

维托里奥的解决方案当然是正确的,而且更加简洁,但坦率地说,typedefs就是为这种事情而设计的:

class point
{
public:
    using ReturnType = DefaultType;
    ReturnType x( ) const  { return ReturnType( 0 ); }
    ReturnType y( ) const  { return ReturnType( 0 ); }
};

auto    casted = static_cast<point::ReturnType>( cast_me );
类点
{
公众:
使用ReturnType=DefaultType;
ReturnType x()常量{ReturnType(0);}
ReturnType y()常量{ReturnType(0);}
};
自动铸造=静态铸造(铸造);


可能值得注意的是,
std::declval
为您提供了一个可以调用不同函数的
prvalue
。@NathanOliver我认为不必,我相信您可以执行
declval
。@NirFriedman您是对的
declval
为您提供了一个
T&
。谢谢@Vittorio Romeo。这听起来不错,但我需要问你,这个解决方案会不会增加(轻微的)开销,用
点{}
实例化一个临时对象?在适当的时候,我不能保证
DefaultConstructible
@fljx没有被偷听到。实际上并不是构造点,只是检查表达式的类型。事实上,
std::declval()
甚至没有定义。可能值得注意的是,
std::declval
提供了一个
prvalue
,可以调用不同的函数。@NathanOliver我认为不必,我相信你可以做
declval
。@Nirfiedman你是对的
declval
为您提供了一个
T&
。谢谢@Vittorio Romeo。这听起来不错,但我需要问你,这个解决方案会不会增加(轻微的)开销,用
点{}
实例化一个临时对象?在适当的时候,我不能保证
DefaultConstructible
@fljx没有被偷听到。实际上并不是构造点,只是检查表达式的类型。事实上,
std::declval()
甚至没有定义。谢谢你的回复。通过使用您的解决方案,我将不得不更改十几个类,并将其作为一种编码模式。可行的,最后的结果是相当好的。@ FLJX为了更好的可维护性,您可以考虑声明类型别名如下:<代码>使用RealType=DeCype(STD::DeCalVar).x());code>您现在可以根据需要更改
x()
的返回类型,而无需修改两个位置。@user2296177这只是我在正文中留下的一个打字错误,构造函数的类型与以前相同。编辑。我认为整个要点是用typedef定义函数接口,而不是相反。更不用说,如前所述,
x
y
具有相同的返回类型,您的方法与此不同。简言之,我认为你的建议不太容易维护(也不太易读)。@Nirfiedman你所说的有道理,我并不反对。从我的角度来看,这个别名的原因是在施法时使用了一种速记方式,因此我会亲自将它命名为
CastType
,而不是
ReturnType
,并将函数ReturnType命名为
auto
。对于这个特定的例子来说,
x
y
具有不同的类型是很奇怪的。此外,还可以使用
std::common_type
来确定一种合适的类型,该类型取决于
x
y
。作为记录,我更喜欢这个答案。@user2296177我明白你的意思,这是一个合理的解释。你好@Nir Friedman。谢谢你的回复。通过使用您的解决方案,我将不得不更改十几个类,并将其作为一种编码模式。可行的,最后的结果是相当好的。@ FLJX为了更好的可维护性,您可以考虑声明类型别名如下:<代码>使用RealType=DeCype(STD::DeCalVar).x());code>您现在可以根据需要更改
x()
的返回类型,而无需修改两个位置。@user2296177这只是我在正文中留下的一个打字错误,构造函数的类型与以前相同。编辑。我认为整个要点是用typedef定义函数接口,而不是相反。更不用说,如前所述,
x
y
具有相同的返回类型,您的方法与此不同。简言之,我认为你的建议不太容易维护(也不太易读)。@Nirfiedman你所说的有道理,我并不反对。从我的角度来看,这个别名的原因是在施法时使用了一种速记方式,因此我会亲自将它命名为
CastType
,而不是
ReturnType
,并将函数ReturnType命名为
auto
。对于这个特定的例子来说,
x
y
具有不同的类型是很奇怪的。此外,还可以使用
std::common_type
来确定一种合适的类型,该类型取决于
x
y
。作为记录,我更喜欢这个答案。@user2296177我明白你的意思,这是一个合理的解释。