C++ 是否可以使用调用站点上对象的静态类型作为其模板方法的自动推断模板参数?

C++ 是否可以使用调用站点上对象的静态类型作为其模板方法的自动推断模板参数?,c++,templates,C++,Templates,模板方法允许为不同的静态参数类型跨越一组方法实例。自动参数推断避免了信息的重复 我们面临这样一种情况:我们想要自动推断为模板参数的静态类型是类实例本身的类型。(在调用站点上,实例的类型可以是比声明模板方法的类更专业的类型。) 例如 类基 { 公众: 模板 T_callingObject foo() { 巴+=1; //只有当T_callingObject //是自动推断出来的! 返回静态_cast(*此); } 私人: int-bar; }; 派生类:公共基 { }; int main() {

模板方法允许为不同的静态参数类型跨越一组方法实例。自动参数推断避免了信息的重复

我们面临这样一种情况:我们想要自动推断为模板参数的静态类型是类实例本身的类型。(在调用站点上,实例的类型可以是比声明模板方法的类更专业的类型。)

例如

类基
{
公众:
模板
T_callingObject foo()
{
巴+=1;
//只有当T_callingObject
//是自动推断出来的!
返回静态_cast(*此);
}
私人:
int-bar;
};
派生类:公共基
{
};
int main()
{
基地;
派生的;
base=base.foo();//我们已经知道base的类型是base
派生=派生的.foo();//idem
}
问题是:有没有办法不重复
基本类型
派生类型


编辑:在
基础上的CRTP
在这里不是一个选项,我们需要有一个共同的祖先类型。

这通常通过CRTP(奇怪的递归模板模式)来解决,方法是将
基础
作为模板本身:

template <typename D>
struct Base {
    D& foo() { return static_cast<D&>(*this); }
};

因为一般来说,如果
foo
需要知道
D
是什么,您就不再有单一的统一类型了。

bar在此未初始化,仅供参考。您可能还有另一个基类和CRTP。正是我建议的:在第一个派生类上有一个基类(公共祖先OP所说的)和CRTP。@Marca:是的,这是解决这个问题的典型方法:)
template <typename D>
struct Base {
    D& foo() { return static_cast<D&>(*this); }
};
struct Base { virtual ~Base() {} };

template <typename D>
struct BaseT: Base {
    D& foo() { return static_cast<D&>(*this); }
};

struct Derived: BaseT<Derived> {};