gpt4 book ai didi

c++ - 定义一个没有默认可构造数据成员的空默认构造函数

转载 作者:行者123 更新时间:2023-11-28 02:18:29 25 4
gpt4 key购买 nike

考虑以下示例:

class MyWrapper {
public:
MyWrapper() {};
private:
ThirdPartyLibraryType impl;
};

假设 ThirdPartyLibraryType 没有默认构造函数,我也无能为力,因为它是第三方库类型。然后这段代码将无法编译,因为默认构造函数 MyWrapper() 必须调用 ThirdPartyLibraryType 的默认构造函数。现在我只希望默认构造函数不执行任何操作,因为我使用默认构造函数的用例如下:

std::array<MyWrapper,10> myArray;
for (int i=0;i<10;++i) {
myArray[i] = generateMyWrapper(...);
}

有没有办法强制生成默认构造函数? (没有开销,我不想使用让 ThirdPartyLibraryType* 具有数据成员的明显解决方案)

编辑:到目前为止,我使用了一种类似于 Yakk 提出的方法,即不依赖默认构造函数,但我认为成员函数调用的情况很难看:

template<class T, size_t N, class C, class CF>
std::array<T,N> gen_array(C const& obj, CF&& f) {
...
use obj.f
...
}

class MyClass {

MyWrapper generateMyWrapper(int i) const { ... }

auto genMyWrapperTypeArray() const {
return
gen_array<
MyWrapper,10,MyClass,
MyWrapper(MyClass::*)(int) const
> (
*this, &MyClass::generateMyWrapper
);
}
}

我没有测试过,我的意思是,如果语法不完全相同,它仍然会比我在默认构造函数可用时使用的简单 for 循环复杂得多。

最佳答案

std::experimental::optional 或等效的 boost 具有适度的开销,但处理“这可能是或未构造”。

一个不安全的等价物是 std::aligned_storage_t ,您在其中进行构建。问题在于破坏,你需要知道它是否被构建。

更好的选择可能是可选整个数组,并且根本没有零参数 ctor。打包构建每个参数所需的内容,并创建一个构造函数而不是循环。

template<class T, size_t...Is, class F>
std::array<T,sizeof...(Is)> gen_array(
std::index_sequence<Is...>, F&&f
){
return {{f(Is)...}};
)


template<class T, size_t N, class F>
std::array<T,N> gen_array(
F&&f
){
return gen_array(std::make_index_sequence<N>{}, f);
)

上面的代码使用每个元素的索引调用传递的 lambda 来构造元素。

关于c++ - 定义一个没有默认可构造数据成员的空默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com