enable_if 没有在构造函数中触发?
enable_if not triggering in the constructor?
我正在尝试实现非常基本的 shared_ptr(为简单起见跳过了大部分函数),对于这种情况,我们有一个基指针并创建一个派生指针,我创建了一个单独的构造函数。
template<typename T>
class shared_ptr {
public:
shared_ptr(T* resource) :pointee_(resource),
refCount_(new size_t(1))
{
std::cout << typeid(resource).name();
deleter_ = [=]() {delete resource; };
}
template<typename U, std::enable_if_t<std::is_base_of_v<T, U>>>
shared_ptr(U* resource) :pointee_(resource),
refCount_(new size_t(1))
{
std::cout << typeid(resource).name();
deleter_ = [=]() {delete resource; };
}
~shared_ptr()
{
--(*refCount_);
if (!(*refCount_)) {
deleter_();
}
}
private:
size_t* refCount_;
T* pointee_;
std::function<void()> deleter_;
};
class A { int a; };
class B :public A {};
int main() {
shared_ptr<A> ptr(new B);
}
这里虽然is_base_of为1(我单独试过),但是enable_if没有触发,conductor也没有启用。而当我删除 enable if 时,重载解析起作用并且构造函数是
已启用。
谁能暗示我错过了什么?我不需要概念上的建议,只是提示我做错了什么或者我如何才能只为 class 层次结构启用此构造函数?
P.S。我知道我可以删除 enable_if,如果类型不可转换,编译器会警告我。
这个声明是错误的:
template<typename U, std::enable_if_t<std::is_base_of_v<T, U>>>
实例化时,enable_if_t
产生 void
。这不是有效的非类型模板参数。尝试使用 int
代替:
template<typename U, std::enable_if_t<std::is_base_of_v<T, U>, int> = 0>
此外,请记住,即使您是通过模板参数来制作 sfinae,它们仍然是参数。通过在= 0
中添加默认参数,调用函数时不需要填写
我正在尝试实现非常基本的 shared_ptr(为简单起见跳过了大部分函数),对于这种情况,我们有一个基指针并创建一个派生指针,我创建了一个单独的构造函数。
template<typename T>
class shared_ptr {
public:
shared_ptr(T* resource) :pointee_(resource),
refCount_(new size_t(1))
{
std::cout << typeid(resource).name();
deleter_ = [=]() {delete resource; };
}
template<typename U, std::enable_if_t<std::is_base_of_v<T, U>>>
shared_ptr(U* resource) :pointee_(resource),
refCount_(new size_t(1))
{
std::cout << typeid(resource).name();
deleter_ = [=]() {delete resource; };
}
~shared_ptr()
{
--(*refCount_);
if (!(*refCount_)) {
deleter_();
}
}
private:
size_t* refCount_;
T* pointee_;
std::function<void()> deleter_;
};
class A { int a; };
class B :public A {};
int main() {
shared_ptr<A> ptr(new B);
}
这里虽然is_base_of为1(我单独试过),但是enable_if没有触发,conductor也没有启用。而当我删除 enable if 时,重载解析起作用并且构造函数是
已启用。
谁能暗示我错过了什么?我不需要概念上的建议,只是提示我做错了什么或者我如何才能只为 class 层次结构启用此构造函数?
P.S。我知道我可以删除 enable_if,如果类型不可转换,编译器会警告我。
这个声明是错误的:
template<typename U, std::enable_if_t<std::is_base_of_v<T, U>>>
实例化时,enable_if_t
产生 void
。这不是有效的非类型模板参数。尝试使用 int
代替:
template<typename U, std::enable_if_t<std::is_base_of_v<T, U>, int> = 0>
此外,请记住,即使您是通过模板参数来制作 sfinae,它们仍然是参数。通过在= 0
中添加默认参数,调用函数时不需要填写