gpt4 book ai didi

c++ - SFINAE 离开了一个拷贝构造函数

转载 作者:IT老高 更新时间:2023-10-28 22:37:06 26 4
gpt4 key购买 nike

在某些条件下,我希望 SFINAE 去掉类模板的复制构造函数和复制赋值运算符。但是如果我这样做,就会生成一个默认的复制构造函数和一个默认的赋值运算符。 SFINAE 是基于我作为类模板参数传递的标签完成的。问题是,SFINAE 仅适用于模板,而复制构造函数/赋值运算符不能是模板。是否有解决方法?

最佳答案

此解决方案使用有条件不可复制的基类(通过将复制构造函数和复制赋值运算符显式标记为已删除)。

template <bool>
struct NoCopy;

template <>
struct NoCopy<true>
{
// C++11 and later: marking as deleted. Pre-C++11, make the copy stuff private.
NoCopy(const NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;
protected:
~NoCopy() = default; // prevent delete from pointer-to-parent
};

template <>
struct NoCopy<false>
{
// Copies allowed in this case
protected:
~NoCopy() = default; // prevent delete from pointer-to-parent
};

示例用法:

template <typename Number>
struct Foo : NoCopy<std::is_integral<Number>::value>
{
Foo() : NoCopy<std::is_integral<Number>::value>{}
{
}
};

int main()
{
Foo<double> a;
auto b = a; // compiles fine
Foo<int> f;
auto g = f; // fails!
}

注意:NoCopy 的析构函数被声明为 protected 以避免虚拟继承(感谢@Yakk 的提示)。

关于c++ - SFINAE 离开了一个拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29430090/

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