将* this传递给基类构造函数是否有效?
template<class Lambda>
struct EmptyL : Lambda
{
EmptyL() : Lambda(*this) //<- is this valid c++?
{ }
};
int main () {
auto l = []() { return 34; };
auto a = EmptyL<decltype(l)>();
return a();
}
EDIT1:
Lambda
的要求是,它必须为空=&gt; static_assert(std::is_empty_v<Lambda>)
答案 0 :(得分:2)
这是有效的并且非常有用:您的基类可能有一个模板ctor,然后它将知道后代的类型。
struct Lambda {
template<typename Desc>
Lambda(const Desc&)
: myType(Desc::myType) // static in Desc
, arity(Desc::arity) {} // static in Desc
Type myType;
const size_t arity;
};
此时,我们有运行时类型enum w / o虚拟表,我们可以向成员提取任意数量的类型相关参数,如果你添加一个,你不需要更改所有后代中的所有ctor调用更多(否则对于虚拟基类来说尤其痛苦),或者更糟糕的是,有这些虚拟fns。你只需将this
传递到任何地方 - 它甚至是宏观友好的:)。
是的,你可以通过传递别的东西来绕过它。不,它不是安全功能 - 它是一种便利功能。这与CRTP非常相似,但基础不是模板,因为它不需要整个类中的编译时后代类型,只在(模板)ctor中。