我有一种情况,当输入类型指定了某些特征时,我希望更改默认函数参数,例如 pmr 对象具有分配器特征和get_allocator
函数,那么我该怎么做?我希望有一个不涉及 SFINAE 的 c++20 解决方案,除非不可能,否则可能使用 if constexpr 或概念,我不想编写两个函数,除非不可能。
template<typename T>
void new_deleter(T* ptr)
{
delete ptr;
}
template <typename T>
void pmr_deleter(T* ptr)
{
ptr->get_allocator().delete_object(ptr);
}
template<typename T>
using deleter_t = void (*)(T*);
// use pmr_deleter by default when possible
template<typename T>
void delete_object(T* ptr, deleter_t<T> deleter = &new_deleter<T>)
{
deleter(ptr);
}
编辑:感谢答案,我想出了以下模式,它可以很容易地适应概念和 if contexpr。
template<typename T>
deleter_t get_default_deleter() {return &new_deleter<T>;}
template<typename T>
deleter_t get_default_deleter()
requires requires (T* ptr) {ptr->get_allocator();}
{
return &pmr_deleter<T>;
}
template<typename T>
void delete_object(T* ptr, deleter_t<T> deleter = get_default_deleter<T>())
{
deleter(ptr);
}
您可以重载函数,并利用这样的事实:将选择更多约束的函数而不是更少约束的函数。
无需使用两个重载,只需
if constexpr
在函数体中使用即可