如何通过通用引用或 std::forward 将这三个 c++ 模板函数合并为一个?
How can I merge this three c++ template function into one by universal reference or std::forward?
我把这些代码搞砸了
template <typename T, void (*Fn)(T *)>
struct CustomF1 final
{
void operator()(T *p) const
{
if (p)
Fn(p);
}
};
template <typename T, void (*Fn)(T)>
struct CustomF2 final
{
void operator()(T p) const
{
if (p)
Fn(p);
}
};
template <typename T, void (*Fn)(T **)>
struct CustomF3 final
{
void operator()(T *p) const
{
if (p)
Fn(&p);
}
};
template<typename T>
void F1(T *p) {}
template<typename T>
void F2(T p) {}
template<typename T>
void F3(T **p) {}
template <typename T, typename Deleter = std::function<void(T *)>>
using CustomUPtr = std::unique_ptr<T, Deleter>;
using Pointer1 = CustomUPtr<Foo1, CustomF1<Foo1, F1>>;
using Pointer2 = CustomUPtr<Foo1, CustomF2<Foo1, F2>>;
using Pointer3 = CustomUPtr<Foo1, CustomF3<Foo1, F3>>;
我可以使用通用参考或 std::forward 或者 if constexpr 或 enable_if 来简化这些代码吗?
unique_ptr存储T的点(作为T*),因为这些代码包装了第三方c代码,将结构的原始malloc包装成RAII unique_ptr风格。
只需合并三个 CustomF* 结构 -> 一个 CustomF0 结构
您可以使用 auto
非类型模板参数:
template <auto Deleter>
struct FunctionDeleter {
template <typename U>
void operator()(U* ptr) const {
if (ptr) {
Deleter(ptr);
}
}
};
FunctionDeleter<F1<int>>
、FunctionDeleter<F2<int>>
和 FunctionDeleter<F3<int>>
尽管函数指针类型不同,但都工作正常。
我把这些代码搞砸了
template <typename T, void (*Fn)(T *)>
struct CustomF1 final
{
void operator()(T *p) const
{
if (p)
Fn(p);
}
};
template <typename T, void (*Fn)(T)>
struct CustomF2 final
{
void operator()(T p) const
{
if (p)
Fn(p);
}
};
template <typename T, void (*Fn)(T **)>
struct CustomF3 final
{
void operator()(T *p) const
{
if (p)
Fn(&p);
}
};
template<typename T>
void F1(T *p) {}
template<typename T>
void F2(T p) {}
template<typename T>
void F3(T **p) {}
template <typename T, typename Deleter = std::function<void(T *)>>
using CustomUPtr = std::unique_ptr<T, Deleter>;
using Pointer1 = CustomUPtr<Foo1, CustomF1<Foo1, F1>>;
using Pointer2 = CustomUPtr<Foo1, CustomF2<Foo1, F2>>;
using Pointer3 = CustomUPtr<Foo1, CustomF3<Foo1, F3>>;
我可以使用通用参考或 std::forward 或者 if constexpr 或 enable_if 来简化这些代码吗?
unique_ptr存储T的点(作为T*),因为这些代码包装了第三方c代码,将结构的原始malloc包装成RAII unique_ptr风格。
只需合并三个 CustomF* 结构 -> 一个 CustomF0 结构
您可以使用 auto
非类型模板参数:
template <auto Deleter>
struct FunctionDeleter {
template <typename U>
void operator()(U* ptr) const {
if (ptr) {
Deleter(ptr);
}
}
};
FunctionDeleter<F1<int>>
、FunctionDeleter<F2<int>>
和 FunctionDeleter<F3<int>>
尽管函数指针类型不同,但都工作正常。