未命名的函数参数

句法果糖

我正在查看一些与n3960标准提案有关的代码,并注意到某些函数具有不带名称的参数,但具有完整的函数定义。有人可以解释这是怎么回事吗?

例:

template <typename ExPolicy, typename IteratorTag>
void test_for_each(ExPolicy const& policy, IteratorTag) //just IteratorTag, no name?
{
    BOOST_STATIC_ASSERT(hpx::parallel::is_execution_policy<ExPolicy>::value);

    typedef std::vector<std::size_t>::iterator base_iterator;
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;

    std::vector<std::size_t> c(10000);
    std::iota(boost::begin(c), boost::end(c), std::rand());

    hpx::parallel::for_each(policy,
        iterator(boost::begin(c)), iterator(boost::end(c)),
        [](std::size_t& v) {
            v = 42;
        });

    // verify values
    std::size_t count = 0;
    std::for_each(boost::begin(c), boost::end(c),
        [](std::size_t v) {
            HPX_TEST_EQ(v, std::size_t(42));
            ++count;
        });
    HPX_TEST_EQ(count, c.size());
}
Yakk-亚当·内夫罗蒙特

如前所述,参数名称是可选的。但是,为什么忽略了这一点?为什么有一个没有名称的参数呢?

这里使用的技术是基于参数类型的功能模板标签类型推导。

您可以调用test_for_each传入任意类型的实例作为第二个参数。无论该参数的值类型是什么,最终都会以形式传递给template函数IteratorTag

在类中,IteratorTag不使用变量的值-我们只关心类型。

IteratorTags用于区分各种std库迭代器-转发,随机访问,输入,输出等。

有了该类型,我们就可以对代码的行为进行细微的更改(或者使用重载来进行细微的更改)。在这种情况下,iterator函数中的IteratorTag类型类型作为其template参数之一,因此该变量的类型根据IteratorTag传入的内容而有所不同

这是使用标记的一种简单版本,该标记称为“标记分配”技术:

template<typename T>
int floor_to_int( T&& t, std::true_type ) { return std::forward<T>(t); }
template<typename T>
int floor_to_int( T&& t, std::false_type ) { return floor(std::forward<T>(t)); }
template<typename T>
int smart_floor( T&& t ) {
  return floor_to_int( std::forward<T>(t), std::is_integral< typename std::decay<T>::type >{} );
}

在这里,该smart_floor函数采用任意类型T,并且仅当它是非整数类型时才对其进行调用floor否则,它只会将其转换为int

我们创建标签类型的实例(在这种情况下为),std::is_integral< typename std::decay<T>::type >并将其传递给内部帮助函数。在这种情况下,我们有两个重载,两个重载都不使用传递的标记的值,仅使用其类型。

上面的实现是相似的,除了在两种情况下都有1个重载。也许该标签类型将以类似的重载方式更深入地使用,或者它可能在某些特质类中以更深层次的使用专门化。

顺便说一句,这里的论点应该是赔率std::iterator_traits< T >::iterator_category或一些自制的boost变体。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

未命名的函数参数

来自分类Dev

未命名函数参数用法

来自分类Dev

混合的已命名和未命名函数参数

来自分类Dev

如何在go中引用未命名的函数参数?

来自分类Dev

在胶水:: glue调用中使用函数的未命名参数...

来自分类Dev

我如何doxygen文档函数的未命名参数?

来自分类Dev

如何在 swift 函数中引用多个未命名的参数

来自分类Dev

清理未命名:0,未命名:1 索引列函数

来自分类Dev

具有无限多个(未命名)参数的函数 - 如何正确访问这些参数?

来自分类Dev

在C中没有stdarg.h的情况下访问函数中的未命名参数

来自分类Dev

函数中的未命名参数:等效于R的三点

来自分类Dev

Swift方法中的多个未命名参数

来自分类Dev

定义未命名的类成员函数?

来自分类Dev

如何调用这个未命名的函数?

来自分类Dev

javascript中的命名函数与未命名函数,并了解分配

来自分类Dev

对列表中的命名函数和未命名函数套用形式

来自分类Dev

命名v未命名数据类型参数

来自分类Dev

javascript中的命名与未命名函数,并了解分配

来自分类Dev

未命名的命名空间,模板化函数和多个包含

来自分类Dev

错误:超类'Bloc'没有不带参数的未命名构造函数。类OverViewListBloc扩展了Bloc <OListEvent,List <OList >> {

来自分类Dev

Haskell,optparse-generic的未命名命令行参数

来自分类Dev

有什么方法可以只获取未命名的参数?

来自分类Dev

如何访问Objective C未命名参数的某些方法?

来自分类Dev

未命名的非类型模板参数有什么意义?

来自分类Dev

未命名的默认参数可防止歧义

来自分类Dev

从尚未命名的Google Cloud Endpoints访问请求参数

来自分类Dev

有什么办法只能获取未命名的参数?

来自分类Dev

如何访问Objective C未命名参数的某些方法?

来自分类Dev

如何引用 when 表达式的未命名参数?

Related 相关文章

  1. 1

    未命名的函数参数

  2. 2

    未命名函数参数用法

  3. 3

    混合的已命名和未命名函数参数

  4. 4

    如何在go中引用未命名的函数参数?

  5. 5

    在胶水:: glue调用中使用函数的未命名参数...

  6. 6

    我如何doxygen文档函数的未命名参数?

  7. 7

    如何在 swift 函数中引用多个未命名的参数

  8. 8

    清理未命名:0,未命名:1 索引列函数

  9. 9

    具有无限多个(未命名)参数的函数 - 如何正确访问这些参数?

  10. 10

    在C中没有stdarg.h的情况下访问函数中的未命名参数

  11. 11

    函数中的未命名参数:等效于R的三点

  12. 12

    Swift方法中的多个未命名参数

  13. 13

    定义未命名的类成员函数?

  14. 14

    如何调用这个未命名的函数?

  15. 15

    javascript中的命名函数与未命名函数,并了解分配

  16. 16

    对列表中的命名函数和未命名函数套用形式

  17. 17

    命名v未命名数据类型参数

  18. 18

    javascript中的命名与未命名函数,并了解分配

  19. 19

    未命名的命名空间,模板化函数和多个包含

  20. 20

    错误:超类'Bloc'没有不带参数的未命名构造函数。类OverViewListBloc扩展了Bloc <OListEvent,List <OList >> {

  21. 21

    Haskell,optparse-generic的未命名命令行参数

  22. 22

    有什么方法可以只获取未命名的参数?

  23. 23

    如何访问Objective C未命名参数的某些方法?

  24. 24

    未命名的非类型模板参数有什么意义?

  25. 25

    未命名的默认参数可防止歧义

  26. 26

    从尚未命名的Google Cloud Endpoints访问请求参数

  27. 27

    有什么办法只能获取未命名的参数?

  28. 28

    如何访问Objective C未命名参数的某些方法?

  29. 29

    如何引用 when 表达式的未命名参数?

热门标签

归档