是否可以将调用站点上对象的静态类型用作其模板方法的自动推导的模板参数
Is it possible to use the static type of an object on call site as an automatically deduced template argument to its template method?
模板方法允许为不同静态类型的参数跨一组方法实例。自动参数推导避免了信息的重复。
我们面临这样一种情况:我们希望自动推断作为模板实参的静态类型是类实例本身的类型。(在调用现场,实例的类型可以是比声明模板方法的类更专门化的类型。)
。
class Base
{
public:
template <class T_callingObject>
T_callingObject foo()
{
bar += 1;
// We have a strong guarantee on this cast only if T_callingObject
// is automatically deduced !
return static_cast<T_callingObject&>(*this);
}
private:
int bar;
};
class Derived : public Base
{
};
int main()
{
Base base;
Derived derived;
base = base.foo<Base>(); // we already know the type of base is Base
derived = derived.foo<Derived>(); // idem
}
问题是:有没有办法不重复base
和derived
的类型?
编辑: Base
上的CRTP在这里不是一个选项,我们需要有一个共同的祖先类型
这通常通过CRTP(奇怪递归模板模式)通过使Base
本身成为模板来解决:
template <typename D>
struct Base {
D& foo() { return static_cast<D&>(*this); }
};
和struct Derived: Base<Derived>
。
您可以对D
参数进行的操作集是受限制的(在Base<Derived>
实例化时是一个不完整的时间),但在您的简单情况下,这是可行的。
您仍然会怀疑是否有人不会无意中写struct Bar: Base<Foo>
,所以只有减少了的问题表面。
EDIT:如果Base
的CRTP不被允许(这种情况经常发生),您可以分层抽象:
struct Base { virtual ~Base() {} };
template <typename D>
struct BaseT: Base {
D& foo() { return static_cast<D&>(*this); }
};
struct Derived: BaseT<Derived> {};
因为一般情况下如果foo
需要知道D
是什么,你不再有一个单一的统一类型
相关文章:
- 将成员函数指针作为参数传递给模板方法
- 一个模板方法,用于同时接受常量和非常量参数
- 基于枚举参数调用专用模板方法
- 可变参数模板方法
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- 是否可以基于类模板的参数调用类方法和全局方法
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- 将方法作为模板化参数传递 C++11
- 在模板方法 c++ 中传递结构参数
- 参数列表中的模板方法"=0"
- C++创建具有可变参数模板方法的接口
- 将具有可选模板类型参数的函数传递给类构造函数并将其分配给方法
- C++11可变参数模板方法完全影子基类方法
- 将C 方法参数转换为模板参数会因编译错误而失败
- 如何将模板方法作为模板参数传递
- 类模板方法的专用化,类型名称是类模板 - 错误:参数处的类型/值不匹配
- 如何在模板方法内从参数包中移动unique_ptr
- 模板化类和非模板化类的可变参数模板方法行为的令人费解的差异
- 从模板模板方法参数中获取类型
- 模板类模板方法参数中的模板别名不起作用