我意识到operator->
返回的内容会在函数调用中调用自己的operator->
,如下所示:
someVarWithOverloadedOperator->someFunc();
调用->
函数的过程将继续,直到其中一个是指针,然后从该指针调用someFunc
。
我的问题是:是否有办法强制模板参数让其->
运算符最终返回某个类:
template<typename ThisClassOperatorMustReturn_TypeA_>
class MyClass{
void foo() {
ThisClassOperatorMustReturn_TypeA_ var;
var->someClassAFunc(); //I need this `->` operator to return type "A"
}
};
有什么办法吗?
答案 0 :(得分:2)
您可以为此创建特征:
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*;
};
然后
static_assert(std::is_same<A*, arrow_last_type<ClassToTest>::type>::value, "unexpected");