C ++专门针对特定类型的lambda

大卫高

我被玩弄的拉姆达“超载”所呈现在这里,并且很快就在那里我发现它方便地创建专业拉姆达倒闭的地步。所以我有点初试,最有希望的尝试是

auto call_for_vector = [] template<typename T> (std::vector<T>) {};

但是,稍后查看cppreference时,表明该标准似乎都不允许这种构造或类似构造。

不支持此类专业化的原因是什么?

我知道可以使用SFINAE来获得这种行为,但是那样它可读性差,更难编写且更容易出错。当然也可以用适当的方法简单地编写一个类operator(),但这是C ++ 03 :-)



这样的语法有什么用?:

一个例子,这将允许一个简单的lambda“重载”,如下面的代码所示

template <class F1, class F2>
struct overload_set : F1, F2
{
    overload_set(F1 x1, F2 x2) : F1(x1), F2(x2) {}
    using F1::operator();
    using F2::operator();
};

template <class F1, class F2>
overload_set<F1,F2> overload(F1 x1, F2 x2)
{
    return overload_set<F1,F2>(x1,x2);
} 

auto f = overload(
         [](auto&& x){ std::cout<<"call by default"<<std::endl;},
         [] template<typename T>(std::vector<T>){std::cout<<"call for vector"<<std::endl;}
         );

例如,可以通过基于此答案中的技术使用SFINAE来获得这种行为,但这又很糟糕。

SFINAE是否有一种简单的解决方法来获取特定的过载?

尼科斯(Nikos Athanasiou)

这类编码乍看起来似乎是多余的,但是我们可以利用一些不错的属性。关于您提到的帖子,我正在计划第2部分,其中展示了一种检查类型是否具有特定成员(函数或数据)的巧妙方法假设您要检查serialize成员函数;而不是使用复杂的机制,我发现它变得很简单:

auto hs = overload( 
    [ ](auto&& x) -> decltype(x.serialize(2), std::true_type{}) { 
        return{}; },       // ^^ this guy ^^ 
    [ ](...) -> std::false_type { return {}; }); 

demo

可以在此处找到标准演变的细节,但是我发布此消息的原因是倡导使用这样一种语法,如果已经有了它,则可以扩展以上内容允许“重载”通用lambda之间的部分排序

auto do_something = overload( 
    [ ]<class X>(shared_ptr<X> x) -> decltype(x.serialize(2), std::true_type{}) { 
        /*do something specific for shared ptrs of X */ return{}; },      
    [ ]<class X>(X& x) -> decltype(x.serialize(2), std::true_type{}) { 
        /*do a generic operation for other types that have serialize*/return{}; },      
    [ ](...) -> std::false_type { /*do nothing*/ return {}; }); 

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++专门针对枚举的函数

来自分类Dev

如何专门针对特定泛型类型的方法?

来自分类Dev

C ++ lambda的返回类型

来自分类Dev

C ++中的lambda类型

来自分类Dev

通过参数C ++的类型专门研究重载的构造函数

来自分类Dev

C ++:如何专门针对类似于数组数组的类A的成员函数来处理A <A <T>>?

来自分类Dev

如何在 C++ 中实现 curl --header(专门针对 tdameritrade)

来自分类Dev

如何分别专门针对整数和浮点类型的模板函数?

来自分类Dev

如何覆盖专门针对单元上的类型的组件函数?

来自分类Dev

从C ++ lambda自动返回的类型

来自分类Dev

如何基于类型相关的类型专门化C ++模板类函数?

来自分类Dev

C ++标准允许自定义类型的std :: to_string专门化吗?

来自分类Dev

C ++模板如何专门用于所有32位POD类型?

来自分类Dev

专门研究使用通用迭代器作为指针值类型的C ++模板函数吗?

来自分类Dev

如何使C ++模板化函数与返回类型无关,以便将来进行专门化

来自分类Dev

C ++模板-专门功能

来自分类Dev

如何针对特定参数自动运行不同数量的C ++代码

来自分类Dev

C#中针对特定日期集的日期计算

来自分类Dev

C ++:部分将模板的类型参数专门化为另一个模板类的成员类型

来自分类Dev

从函数返回的C ++类型的lambda闭包

来自分类Dev

C ++ 11对lambda返回类型的限制

来自分类Dev

如何让C ++从Lambda推断模板类型参数?

来自分类Dev

如何专门针对一种类型的可变参数模板类?

来自分类Dev

针对特定文件类型的Vim配色方案

来自分类Dev

专门针对void参数的模板

来自分类Dev

如何确定C ++ lambda的结果类型(封闭类型)

来自分类Dev

在C ++ 11中,我如何专门化基于返回类型接受函数对象的函数模板?

来自分类Dev

C++ - 在具有非类型模板参数的模板化类上专门化函数模板

来自分类Dev

C#类型特定的观察者

Related 相关文章

  1. 1

    C ++专门针对枚举的函数

  2. 2

    如何专门针对特定泛型类型的方法?

  3. 3

    C ++ lambda的返回类型

  4. 4

    C ++中的lambda类型

  5. 5

    通过参数C ++的类型专门研究重载的构造函数

  6. 6

    C ++:如何专门针对类似于数组数组的类A的成员函数来处理A <A <T>>?

  7. 7

    如何在 C++ 中实现 curl --header(专门针对 tdameritrade)

  8. 8

    如何分别专门针对整数和浮点类型的模板函数?

  9. 9

    如何覆盖专门针对单元上的类型的组件函数?

  10. 10

    从C ++ lambda自动返回的类型

  11. 11

    如何基于类型相关的类型专门化C ++模板类函数?

  12. 12

    C ++标准允许自定义类型的std :: to_string专门化吗?

  13. 13

    C ++模板如何专门用于所有32位POD类型?

  14. 14

    专门研究使用通用迭代器作为指针值类型的C ++模板函数吗?

  15. 15

    如何使C ++模板化函数与返回类型无关,以便将来进行专门化

  16. 16

    C ++模板-专门功能

  17. 17

    如何针对特定参数自动运行不同数量的C ++代码

  18. 18

    C#中针对特定日期集的日期计算

  19. 19

    C ++:部分将模板的类型参数专门化为另一个模板类的成员类型

  20. 20

    从函数返回的C ++类型的lambda闭包

  21. 21

    C ++ 11对lambda返回类型的限制

  22. 22

    如何让C ++从Lambda推断模板类型参数?

  23. 23

    如何专门针对一种类型的可变参数模板类?

  24. 24

    针对特定文件类型的Vim配色方案

  25. 25

    专门针对void参数的模板

  26. 26

    如何确定C ++ lambda的结果类型(封闭类型)

  27. 27

    在C ++ 11中,我如何专门化基于返回类型接受函数对象的函数模板?

  28. 28

    C++ - 在具有非类型模板参数的模板化类上专门化函数模板

  29. 29

    C#类型特定的观察者

热门标签

归档