当前位置: 首页 > 知识库问答 >
问题:

从C++模板专门化中调用“基”模板函数来“覆盖”它?

张唯
2023-03-14

问题:

使用继承,可以执行以下操作:

struct base { 
    virtual void go() { printf("%p", this); }
};
struct foo : base { 
    virtual void go() { printf("this foo lives at "); base::go(); } 
};

...调用foo::go()将打印“this foo Living at

不过,使用模板:

template <typename T>
void go(T const &t) { printf("%p\n", &t); }

template <>
void go(foo const &f) { 
    printf("this foo lives at "); 
    ??? how to access "base" template ??? 
}
template <typename T>
void _go_pre(T const &t) { /* do nothing */ }

template <typename T>
void _go_post(T const &t) { /* do nothing */ }

template <typename T>
void go(T const &t) { 
    _go_pre(t); /* just in case */
    printf("%p\n", &t); 
    _go_post(t); 
}

template<>
void _go_pre(foo const &t) { printf("this foo lives at "); }

所有这些都与您在子类无法访问父类提供的原始版本的情况下使用虚拟方法重写时遇到的问题如出一辙。

共有1个答案

辛建业
2023-03-14

不可能直接。但是,您可以使用更少(也不那么难看)的助手,如下所示:

template <typename T>
void base_go(T const &t) { printf("%p\n", &t); }

template <typename T>
void go(T const &t) { base_go(t); }

template<>
void go(foo const &t) { printf("this foo lives at "); base_go(t); }

作为替代方案,您可以将base_变体放到单独的命名空间中,而不是给它们指定修改过的名称。

 类似资料:
  • 我试图编写一个可变函数模板来计算的字节大小。这将用于一个网络编程项目,我正在工作。第一步,我在没有工作的variadic模板的情况下想出了这个: 错误代码#2。如果我将variadic模板放在不同的位置: 我得到了 错误:重载的'size t ()'调用不明确

  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 在本文中,他们说(c)是(b)的显式专门化。我的疑问是,为什么我们不能说它是(a)的显式专门化?因为我们可以为任何特定类型专门化模板。所以,当专门化int*时,为什么他们说(c)显式专门化(b)。 任何评论都将有助于理解事情。

  • 我有一个模板基类,其模板参数类型为bool。此基类的构造函数参数列表取决于模板参数是true还是false。我想从这个类派生另一个模板类,它的模板参数是任意类型的。我需要这个派生类根据该类型的特征调用该基类的正确构造函数。 下面的例子并不包罗万象。无论是否为整数,基类模板bool可以是任何类型trait。此外,传递给派生类的模板参数的类型可以是任何类型。

  • 关于下一个代码,我有一些问题: > 类专业化

  • 我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。