【发布时间】:2015-05-14 07:45:28
【问题描述】:
我有以下基本模板类。
template<typename T>
class Base {
public:
void do_something() {
}
};
它旨在用作奇怪地重复出现的模板模式。它应该像class B : public Base<B> 一样被继承。它必须不像class B : public Base<SomeoneElse> 那样被继承。我想静态地强制执行这个要求。如果有人用错了,我预计在编译阶段会出错。
我正在做的是将static_cast<T const&>(*this) 放入do_something()。这样,继承模板的类是或继承自作为模板参数提供的类。对不起,令人困惑的表达。简单来说,它要求B 是或继承自class B : public Base<SomeoneElse> 中的SomeoneElse。
我不知道这是否是实现这一目标的最佳方式。我觉得很恶心。
但是我想做更多。我想确保B 本身就是SomeoneElse。我该怎么做?
【问题讨论】:
-
static_cast不强制执行任何操作;如果*this实际上不是T,它只会导致未定义的行为。 -
@T.C.它进行静态检查。你说的应该是
reinterpret_cast。 -
它只检查
T是从Base<T>派生的,而不是*this是T。即,给定class Bar : public Base<Bar> {}; class Foo : public Base<Bar> {};,您的支票不会捕获任何东西。
标签: c++ templates inheritance crtp