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");