gpt4 book ai didi

c++ - 检查子类的构造函数是否在 C++ 中是公共(public)的

转载 作者:行者123 更新时间:2023-11-30 05:33:04 24 4
gpt4 key购买 nike

希望这不会重复,但无法找到一个优雅的解决方案。是否可以说特殊基类的子类只能在模板工厂函数中创建?为了简单起见,我只想在基类中强制执行此行为。这是一个简单的例子:

template <class T>
T* createBase();

template<typename T>
class Base {
protected:
template <class T>
friend T* createBase();

static T* create()
{
return new T();
}
};

class TestClass1 : public Base<TestClass1>
{
public:
TestClass1() : Base() {}
};

template <class T>
T* createBase()
{
static_assert(std::is_base_of<Base<T>, T>::value, "use the createBase function only for Base<T> subclasses");
return Base<T>::create();
}

实际上这是允许的:

TestClass2 *testClass = createBase<TestClass2>();
TestClass2 tester;

但我只想拥有这个:

TestClass1 *testClass = createBase<TestClass1>(); //allowed
TestClass1 tester; // compile error

当然我知道我只需要将 TestClass1 的构造函数放在 privateprotected 中。但如果在 Base 对象中这样说,那就太好了。

编辑:

当子类的构造函数是公共(public)的时出现编译错误也是一个不错的解决方案。也许使用 static_assert()。

最佳答案

即使使用 CRTP,您也无法从基类控制构造函数的可访问性。

您可以做的是在基构造函数中添加一个 static_assert 检查 T a.k.a 派生类没有可公开访问的默认构造函数:

template <class T>
class Base {
public:
Base() {
static_assert(!std::is_default_constructible<T>::value,
"T must not be default constructible");
}
};

static_asswert 不适用于类作用域,原因如下:CRTP std::is_default_constructible not working as expected

关于c++ - 检查子类的构造函数是否在 C++ 中是公共(public)的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34923068/

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