[英]need to return the same type as this from c++ template function
我希望有一个模板函数返回相同类型this
。 在parens中获取参数的类型很容易,但是我看不到如何获取其方法被调用的对象的类型。
struct ENode {
ENode* mnext;
ENode(ENode* n):mnext(n){}
template<typename T>T* next(T* unused) { return (T*)mnext; }
template<typename T>T* xnext() { return (T*)mnext; }
};
struct TNode : public ENode {
int val;
TNode(int v, TNode* n):val(v),ENode(n){}
};
void printTN(TNode* n) {
while(n) {
printf("%i -> ", n->val);
// n=n->next(n); // ok, but n is unused
// n=n->xnext(); // error: template argument deduction/substitution failed: couldn't deduce template parameter ‘T’
// n=n->xnext<std::remove_reference<decltype(*n)>::type>(); // works, but is very ugly
n=n->xnext<TNode>(); // works, but is ugly
}
printf("nil\n");
}
我如何让n->next()
返回与n
相同的类型?
编辑 关于基于其返回类型的函数的模板推导? ,这将对我有帮助。 但是C ++中的返回类型没有重载或类型推断 (与Java不同)。 因此,我想要*this
类型的重载。
一种常见的模式是让整个ENode类都带有一个模板参数,而不仅仅是next / xnext方法。
例如,
template <typename T> struct ENode {
...
T* next() { return mnext; }
};
struct TNode : ENode<TNode> { ... }
如果您不介意语法上的微小变化,那么一种可能是使next
一个自由函数模板成为可能:
struct ENode {
ENode* mnext;
ENode(ENode* n):mnext(n){}
template<typename T> friend T* next(T *self) { return static_cast<T*>(self->mnext); }
};
struct TNode : public ENode {
int val;
TNode(int v, TNode* n):val(v),ENode(n){}
};
void printTN(TNode* n) {
while(n) {
printf("%i -> ", n->val);
n = next(n);
}
printf("nil\n");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.