【发布时间】:2015-10-24 15:08:23
【问题描述】:
考虑以下示例:
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 循环复杂得多。
【问题讨论】:
-
也许我误解了你的问题,你能用一些默认值调用
ThirdPartyLibraryType的ctor吗?如MyWrapper() : impl(some_default_value) {}; -
如果重点是在没有默认构造函数的情况下初始化数组,为什么不直接切换到向量呢?
vector<MyWrapper> myVector; for (int i=0;i<10;++i) myVector.push_back(generateMyWrapper(...));? -
@songyuanyao 是的,你可以这样做。有两个问题:1:我不知道默认构造函数的有效 some_default_value 2:代码是模板化的,
ThirdPartyLibraryType引用了许多不同的类型,可能具有不同的非默认构造函数 -
@Christophe 是的,我可以做到这一点,但矢量速度较慢。但是,也许可以实现类似于 std::array 的不强制元素默认构造的类型...
标签: c++ c++11 default-constructor regular-type