检测类是否具有签名的构造函数

Aar*_*man 1 c++ template-meta-programming c++17

如果一个类有一个具有给定签名的构造函数,我如何编译时检测?具体来说,我想做以下事情:

class Archive
{
    // (...)

    template <typename T>
    T Read()
    {
        if constexpr(HasUnarchiveConstructor<T>())
        {
            return T(*this); // constructor accepts reference to Factory
        }
        else
        {
            T t;
            Unarchive(*this, t); // use stand alone function instead. (if this is not available either, compiling fails)
            return t;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有许多用于检测具有特定签名的功能的源.但是我无法将这些转换为构造函数. 源1 源2 源3等等.

从我发现的源代码中我编译了以下内容以检测函数是否具有plus运算符:

template<typename T>
using HasUnarchiveConstructorImpl = decltype(std::declval<T>() + std::declval<T>());

template< typename T >
using HasUnarchiveConstructor = std::is_detected<HasUnarchiveConstructorImpl, T>;
Run Code Online (Sandbox Code Playgroud)

如何将其扩展到我想要执行的检查?或者我怎么能以不同的方式做到这一点?

How*_*ant 10

我会用:

if constexpr(std::is_constructible<T, Archive&>{})
Run Code Online (Sandbox Code Playgroud)

这个特性存在,<type_traits>并为您准备和调试.有一整套特征可以检测到这个问题的变体.