C ++将* this传递给基础构造函数

时间:2017-10-11 18:15:12

标签: c++ c++11

将* 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表达式生成的ClosureType不是默认可构造的。通过这个“Trick”,我能够默​​认构造这样一个ClosureType。
  • 另外,模板参数Lambda的要求是,它必须为空=&gt; static_assert(std::is_empty_v<Lambda>)

1 个答案:

答案 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中。