c++ - 如何通过通用引用或 std::forward 将这三个 C++ 模板函数合并为一个?

标签 c++ templates c++17 forwarding-reference if-constexpr

我已经把这些代码搞砸了

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>>尽管具有不同的函数指针类型,但所有工作都正常。

关于c++ - 如何通过通用引用或 std::forward 将这三个 C++ 模板函数合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58882977/

相关文章:

c++ - 具有多个属性表的 Visual Studio 2013 项目

c++ - 在模板中定义友元函数的实例化

c++ - 有没有办法检查 2 个聚合是否等效?

c++ - 是否有更惯用的方式来拆分 std::vector?

c++ - 如何使用作为模板参数的模板

c++ - 返回泛型类的引用

c++ - 范围和分解的原因不允许constexpr

c++ - 使用 boost::pfr 获取字段名称

c++ - 纯虚函数的继承

c++ - 找不到基类模板的成员