我想要一个模板函数返回相同的类型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.
一个常见的模式是让整个ENode类采用模板参数,而不仅仅是下一个/ xnext方法.
例如,
template <typename T> struct ENode {
...
T* next() { return mnext; }
};
struct TNode : ENode<TNode> { ... }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |