当前位置: 首页 > 知识库问答 >
问题:

具有最小复制的前向函子

邬友樵
2023-03-14

我想转发函数调用和复制函数只有在绝对必要的时候。下面是我的泛型包装函数和函子:

template <typename F>
void wrapper (F func)
{
  func ();
}

struct Functor
{
  Functor() {}
  void operator() () { /* do some work */ }
};
    null
using safe_mutual_handler_type =
  typename std::conditional<
    std::is_reference<F>::value
  , typename std::conditional<
      std::is_const<typename std::remove_reference<F>::type>::value
    , typename std::remove_const<typename std::remove_reference<F>::type>::type
    , F&
    >::type
  , F&
  >::type;

template <typename F>
void wrapper (F&& func)
{
  safe_mutual_handler_type<F> tmp = func;
  tmp ();
}
struct Functor {
  Functor() {}
  void operator() () const {}
};

问题是:如果函子有常量括号运算符,我如何在包装器中检查?另一个问题是包装器是否可以在没有大量类型特征TypeDefs行的情况下以更聪明、更紧凑的方式实现?(实际上,我担心的不是代码大小,而是代码可读性)。

共有1个答案

璩华辉
2023-03-14

如果只是想在引用的调用有效的情况下使用引用,请使用表达式sfinae:

template <typename F>
auto wrapper_ (F&& func, int) -> decltype(func())
{
    func ();
}

template <typename F>
void wrapper_ (F func, ...)
{
    func ();
}

template <typename F>
void wrapper (F&& f)
{
    wrapper_(std::forward<F>(f), 0);
}

如果您只想在传递一个可变引用时复制/移动它(并且仅限于此):

template <typename F>
auto wrapper_ (F&& func, std::true_type)
{
    func ();
}

template <typename F>
void wrapper_ (F func, std::false_type.)
{
    func ();
}

template <typename F>
void wrapper (F&& f)
{
    wrapper_(std::forward<F>(f), std::is_const<typename std::remove_reference<F>::type>());
}
 类似资料:
  • 我用直方图解决方案编写了这段代码,但用户将输入其矩阵,而不是在代码上输入矩阵。现在看看我做错了什么,除了柱状图的数学之外,一切似乎都正常。我做错了什么? 用户将输入行和列,然后一个接一个地输入矩阵中的每个值。然后代码将显示矩阵并计算所有1的最大大小矩形二进制子矩阵。

  • 问题内容: 有以下选择: 我想获得具有最小值N_UM的行(仅一个),在这种情况下,其ID = 10(10 0)的行。 问题答案: 试试这个 -

  • 我想找到最有效的方法来检查二进制搜索树中最小值的节点。我现在不想用某种编程语言来做,我只想考虑最有效的算法。 对此你怎么看: 我的问题是我应该如何深入挖掘,直到我得到最后一个左节点。我也试着解释这些步骤。你认为那是做这件事的最好方法吗?

  • 问题内容: 如果不可变的类对象副本将与原始副本相等,那么为什么Java 中的类具有副本构造函数?这是一个错误还是背后有原因?在Java文档中,指定了: 问题答案: 复制字符串的主要原因是为了 “修剪行李” ,即仅将底层char数组修剪为必需的字符。 基本的char数组可能太大,因为通过调用创建字符串时,char数组可以在新的字符串实例和源字符串实例之间共享;偏移量指向第一个字符,并且包括长度。 我

  • 问题内容: 我试图一次从一张桌子上得到2行。上周的最小日期时间(今天-7)和最晚的日期(今天)的一个。 我的桌子: 我可以通过以下方式选择上周的数据: 但我只想要第1行和第125行,因为这些是用于计算的行。所以我的问题是: 如何从上一个查询的结果中选择2行(带有MIN和MAX日期)? 问题答案: 您可以使用此: 编辑: 由于两台计算机完全有可能具有相同的值,因此应更新查询以在子句中也包含过滤器。我

  • 我正在尝试使用javascript中的minimax算法实现一个连接四个AI。目前,速度很慢。除了我将要实现的alpha-beta修剪之外,我想知道是否值得将游戏状态散列为 他们的启发式评估 下一个最佳举措 我可以立即明白为什么2会很有用,因为有很多方法可以达到相同的游戏状态,但我想知道我是否也必须散列当前深度才能使其工作。例如,如果我以3的深度达到这种状态(所以只说再向前看4步),而深度为2,向