检查一个班级是否有副本ctor?返回true或false

时间:2015-09-04 13:40:26

标签: c++ sfinae

在下面的代码片段中,我试图确定一个类是否有拷贝ctor。 如果我的班级没有复制ctor,我只会看到编译错误。我无法让它返回真或假。请帮帮我...

template <typename T>
auto has_copy_ctor(T const& data) -> decltype(T(data), bool())
{
    return true;
}

struct A
{
    A(A const& obj) = delete;
};

struct B {};

int main()
{
    std::cout << has_copy_ctor<B>(B{}) << std::endl; // compiles
    std::cout << has_copy_ctor<A>(A{}) << std::endl; // does not compile
}

3 个答案:

答案 0 :(得分:3)

考虑使用std::is_copy_constructible

SFINAE表示无法替换的模板不是错误,但如果没有模板匹配,您仍然会出现错误。在您的情况下,您需要第二个模板函数,该函数对于不可复制构造的类返回false。

在libc ++中,使用is_copy_constructible非标准编译器内在函数实现__is_constructible。由于这些都保持在最低限度,如果可能的话,“原生C ++”实现可能是非平凡的。

答案 1 :(得分:2)

以下是如何扩展您的方法(使用函数模板)来检查类型是否是可复制构建的(在<type_traits>不可用的世界中):

#include <utility>

template <typename T>
constexpr auto has_copy_ctor(int)
    -> decltype(T(std::declval<const T&>()), void(), bool())
{
    return true;
}

template <typename T>
constexpr bool has_copy_ctor(char)
{
    return false;
}

template <typename T>
constexpr bool has_copy_ctor()
{
    return has_copy_ctor<T>(0);
}

DEMO

答案 2 :(得分:1)

您可以使用std::is_copy_constructible

int main()
{
    std::cout << std::is_copy_constructible<B>::value << std::endl;
    std::cout << std::is_copy_constructible<A>::value << std::endl;
}