繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM