在下面的代码片段中,我试图确定一个类是否有拷贝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
}
答案 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);
}
答案 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;
}