需要从c ++模板函数返回与此相同的类型

1 c++ c++11 c++14

我想要一个模板函数返回相同的类型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");
}
Run Code Online (Sandbox Code Playgroud)

我如何n->next()返回相同的类型n

编辑 至于 模板扣除功能基于它的返回类型?如果可能的话,它会对我有所帮助.但是C++中的返回类型没有重载或类型推断(与Java不同).因此我想要一个类型的重载*this.

Phi*_*l M 5

一个常见的模式是让整个ENode类采用模板参数,而不仅仅是下一个/ xnext方法.

例如,

template <typename T> struct ENode {
    ...
    T* next() { return mnext; }
};
struct TNode : ENode<TNode> { ... }
Run Code Online (Sandbox Code Playgroud)