当前位置: 首页 > 知识库问答 >
问题:

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

龚招
2023-03-14
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();
}
  • 我为什么要这样做?因为lambda表达式生成的ClosureType不是默认可构造的。通过这个“技巧”,我可以默认构造这样的closureType。
  • 此外,模板参数lambda的要求是,它必须为空=>static_assert(std::is_empty_v )

共有1个答案

汪甫
2023-03-14

这是有效的,非常有用:基类可能有一个模板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;
};

此时,我们有了不带虚表的运行时类型枚举,我们可以提取任意数量的依赖于类型的参数到成员,并且如果您再添加一个(否则这对虚拟基类来说特别痛苦),您就不需要更改所有后代中的所有ctor调用,或者更糟的是,有了这些虚拟fn。您只需到处传递this-它甚至是宏友好的:)。

是的,你可以通过传递其他东西来绕过它。不,这不是一个安全功能--这是一个便利功能。这与CRTP非常相似,但基不是模板,因为它不需要整个类中的编译时后代类型,只需要在(template)ctor中。

 类似资料:
  • 我试图将构造函数参数动态传递给Springboot框架中的一个bean。我已经使用context.getBean(class,arg...)在Spring中动态传递构造函数参数,但它没有成功获取值并显示默认值。我的代码有什么问题? 项目结构: 应用程序上下文.xml 应用 活动 输出:

  • 问题内容: 我的工厂如下 这是Foo的定义: 好。我不确定如何使用Guice将此参数传递给Foo构造函数? 有任何想法吗? 问题答案: 所有“ Guice构造函数参数”答案在某种程度上似乎都不完整。这是一个完整的解决方案,包括用法: //在实现类上注释构造函数和辅助参数 //使用仅接受辅助参数的create()方法创建工厂接口。 // FooFactory接口没有显式的实现类(Guice Magi

  • 我需要使用ArrayList在java中实现我自己的通用二进制堆。它需要支持最大堆和最小堆。这应该通过将比较器传递给BinaryHeap构造函数来实现。 尝试了Dmitrys通知,它生成。这是采用比较器的超级构造函数:

  • 我创建了一个Author对象,用于构造函数的方法签名:public Book但是,我所做的赋值要求将Author(实例变量)更改为。当然,现在我以前的构造函数不行了。这是密码 如果我上传的方式不令人满意,我对任何不便表示歉意。我还没有学会使用堆栈溢出。 谢谢!

  • 问题内容: 我有一个C函数声明如下: 如今,我的cython包装器代码使用了numpy数组中的缓冲区语法: 我想使用新的memoryview语法,我的问题是,使用memoryview时如何将指针传递给数据? 我试过了: 当我尝试编译模块时,出现了“无法将类型’long [:]’分配给’long *’”的错误。有没有什么方法可以在调用C函数之前将指针传递给numpy数组而不将其强制转换为numpy数

  • 我试图使一个用户类和使用类来处理登录,但从某种原因我的用户类构造函数是读取我的mysqli对象作为一个字符串 这是我的密码 Class.php mysql.php checklogin.php 它给了我这个错误 可捕获的致命错误:在第13行的C:\wamp\www\class.php中,类mysqli的对象无法转换为字符串 我要把头发拔出来了,有什么想法吗?