2
我想知道是否可以实现某些模板。 我想要做的是允许从一个模板到另一个模板的特定“复制ctors和分配操作符”,并禁用其他模板。允许/禁止模板的特殊字体复制和分配操作
我想我管理的只是我想要的东西之一,所以我提供了下面的类。 对于副本构建函数或赋值操作符我希望能够做到以下
Foo<false>
到Foo<false>
总是OKFoo<true>
应该只允许复制或分配给Foo<false>
我不是肯定是否有可能...
#include <iostream>
#include <type_traits>
using namespace std;
template<bool Owner>
class Foo
{
static constexpr bool owner_ = Owner;
public:
Foo() {std::cout << "ctor\n";}
Foo operator=(const Foo& foo) { std::cout << "assignment\n";}
Foo(const Foo& foo) { std::cout << "copy ctor \n"; }
template <bool U>
Foo(const Foo<U>& other)
{
std::cout << "copy ctor2 \n";
}
template <bool U>
Foo<false>& operator=(const Foo<U>& other)
{
std::cout << "assignment 2 \n";
return *this;
}
template < bool B_ = Owner, typename = std::enable_if_t <B_> >
void bar1() {
std:cout << "bar1 " << owner_ << "\n";
}
void bar2() {std:cout << "bar2 " << owner_ << "\n";}
};
目前唯一的硫如果我成功了operator=
将工作为Foo<false>
= Foo<true>
。 Foo<false>
到Foo<false>
是可以的,但允许所有其他转换以及Foo<true>
到Foo<true>
也是可能的。
谢谢,这看起来不错,但我不知道是否有2箱,也可以cought。 这就是 'auto t3(t1);'会工作,所以会'auto ta = t1;' 此外,如果我想添加一些有用的static_assert来说“这不被支持”它会去哪里? – xerion
对不起,我在完成之前意外发布了评论。编译器定义的复制构造函数和assignement似乎允许这两个 – xerion
类似地,我认为''转换专门化甚至没有被使用,而是编译器生成的函数是首选。 –
xerion