我需要检查类C
是否具有默认构造函数,可以是隐式的也可以是自定义的,并且可以是public
、protected
或private
之一。
我尝试使用std::is_default_constructible<C>::value
来进行检查,如果C
具有public
默认构造函数(隐式的或自定义的),则返回true,但如果C
具有protected
或private
默认构造函数,则返回false
(这似乎是标准行为)。
有没有办法检查一个类是否有protected
或private
默认构造函数?
注意(如果这可能有帮助):检查是从一个C
类的friend
函数执行的。
我需要执行此检查以便对Foo
对象的m_objs
元组的nullptr
指针进行默认构造(以下是Foo
定义的部分内容):
template<class... Objects>
class Foo
{
public:
Foo(Objects*... objects)
: m_objs(objects...)
{
// User construct a Foo objects passing a pack of pointers
// some of them are nullptr, some are not.
// The following call should default-construct objects corresponding
// to the null pointers of m_objs member tuple:
objs_ctor<Objects...>();
}
private:
template<class Obj, class O1, class ...On>
void objs_ctor()
{
objs_ctor<Obj>(); objs_ctor<O1, On...>();
}
template<class Obj>
typename std::enable_if<std::is_default_constructible<Obj>::value, void>::type
objs_ctor()
{
Obj*& obj = std::get<Obj*>(m_objs);
if (obj == nullptr)
obj = new Obj; // default-construct Obj
}
template<class Obj>
typename std::enable_if<!std::is_default_constructible<Obj>::value, void>::type
objs_ctor()
{
Obj*& obj = std::get<Obj*>(m_objs);
assert(obj != nullptr); // terminate if not pre-constructed
}
private:
std::tuple<Objects*...> m_objs;
};
旨在用作:
struct A { };
class B {
B() = default;
template <class... Ts>
friend class Foo;
};
int main() {
// currently asserts, even though Foo<A,B> is a friend of B
// and B is default-constructible to its friends
Foo<A, B> foo(nullptr, nullptr);
}
这个例子是错误的,因为std::is_default_constructible<B>::value
为false,即使B
有一个[私有]默认构造函数,并且Foo<A,B>
是B的友元。
void foo()
为B
的朋友的基本类B
来证明这一点,std::is_default_constructible<B>::value
在foo()
内返回false
。 - shrike