【发布时间】:2021-11-10 00:07:49
【问题描述】:
我正在尝试为我的std::unique_ptr 编写删除器,并且我想重载删除方法。这是我尝试过的,但编译器抱怨使用std::enable_if_t。代码使用-std=c++20 标志编译。
template <class T>
class custom_deleter
{
public:
template <class U, std::enable_if_t<std::is_array_v<T>, bool> = true>
void operator()(U* ptr) { std::cout << "array"; }
template <class U, std::enable_if_t<!std::is_array_v<T>, bool> = true>
void operator()(U* ptr) { std::cout << "non-array"; }
};
这是编译器错误:
main.cpp:17:10: error: no type named 'type' in 'struct std::enable_if<false, bool>'
17 | void operator()(U* ptr) { std::cout << "non-array"; }
| ^~~~~~~~
我不明白这个问题。起初,我以为我缺少 std::enable_if_t 可用的包含或编译标志,但这不是问题所在。任何帮助表示赞赏。
【问题讨论】:
-
我相信
enable_if_t条件必须依赖于U(或operator()的某些模板参数)。或者,您可以使用 C++20 中的requires。 -
谢谢,现在才意识到。由于我可以访问 C++20,因此使用
if constexpr使其更具可读性。
标签: c++ templates c++20 unique-ptr sfinae