C++ 如何判断一个-&燃气轮机&引用;运算符最终返回一个类型?
我意识到,C++ 如何判断一个-&燃气轮机&引用;运算符最终返回一个类型?,c++,templates,operator-keyword,C++,Templates,Operator Keyword,我意识到,操作符->返回的内容将在如下函数调用中调用自己的操作符->: someVarWithOverloadedOperator->someFunc(); 调用->函数的过程将继续,直到其中一个函数是指针,然后从该指针调用someFunc 我的问题是:有没有办法强制模板参数使其->运算符最终返回某个类: template<typename ThisClassOperatorMustReturn_TypeA_> class MyClass{ void foo() {
操作符->
返回的内容将在如下函数调用中调用自己的操作符->
:
someVarWithOverloadedOperator->someFunc();
调用->
函数的过程将继续,直到其中一个函数是指针,然后从该指针调用someFunc
我的问题是:有没有办法强制模板参数使其->
运算符最终返回某个类:
template<typename ThisClassOperatorMustReturn_TypeA_>
class MyClass{
void foo() {
ThisClassOperatorMustReturn_TypeA_ var;
var->someClassAFunc(); //I need this `->` operator to return type "A"
}
};
模板
类MyClass{
void foo(){
该类运算符必须返回\u TypeA\uvar;
var->someClassAFunc();//我需要这个`->`操作符来返回类型“A”
}
};
有什么方法可以做到这一点吗?您可以为此创建一个特性:
template <typename T>
using arrow_type = decltype(std::declval<T>().operator ->());
template <typename T, typename ArrowType = arrow_type<T>>
struct arrow_last_type
{
using type = typename arrow_last_type<ArrowType>::type;
};
template <typename T, typename P>
struct arrow_last_type<T, P*>
{
using type = P*;
};
模板
使用arrow_type=decltype(std::declval().operator->());
模板
结构箭头\u最后\u类型
{
使用type=typename arrow\u last\u type必须“按原样”使用某个类,或者可以为该类添加特定的方法或成员以实现此模板限制?您希望它在链调用、第一次调用或链末尾返回a
(因此a*
)?您是否尝试过std::is_same
在a*
和declltype(var.operator->())
之间的静态断言(在丢弃const
后,如果相关)?@Jarod42我希望链的末端是一个a*
@TonyD,它不会工作,因为declltype(var.operator->())
可能是中间类型(例如,A*
可以是var.operator->().operator->();
static_assert(std::is_same<A*, arrow_last_type<ClassToTest>::type>::value, "unexpected");