C ++ 14自动lambda可以接受Obj <std :: tuple <void>>-但是模板函数不能吗?

CrashNeb

下面是一个程序,完全演示了我所遇到的问题。

首先,我从使用其他类型的分组定义的对象开始,开始使用std :: tuple <>来管理分组。

template <typename> class object;
template <typename... Rs> class object<std::tuple<Rs...> > {
};

打算这些对象能够具备的类型void散落在“包”。我已经知道无法“实例化”这种类型的元组(请参阅std :: tuple中的Void类型

我想传递这些对象,也许是复制/移动它们……它们的数据成员都不是这些类型的元组。实际上,我可以使用上面的空对象定义来重现该问题。

可以使用以下方法使其工作:

template <typename... Rs> struct TGrp {};

template <typename> class object;
template <typename... Rs> class object<TGrp<Rs...> > {
};

这些类型的“分组”结构在可变参数递归中经常使用,并且它们永远都不会被创建/使用。只是为了对模板参数进行分组。

但是,我“希望”“对象”的签名由“用户期望的”类型/名称组成。

基本上,我正在尝试使用任何可能的方式来传递何时将这些对象之一std::tuple用于“分组”,并且只能找到一种方式:自动lambda。

谁能解释:

  1. 为什么“自动” lambda可以做到这一点?

    关于延迟模板推论的东西?像差异黑白“自动”和“ decltype(自动)”?

  2. 如何“设计”功能参数以接受这些对象之一。

-感谢大家对这种奇怪的见解

例子:

#include <tuple>
#include <iostream>

#define GRP std::tuple      // IF 'tuple' used:  compile error where noted below
//#define GRP TGrp          // if THIS is used:  all works, and TGrp() is never constructed


// Grouping mechanism
template <typename... Ts> struct TGrp {
    TGrp() {
        std::cout << "Never printed message\n";
    }
};


// MAIN OBJECT (empty for forum question)
template <typename> class object;
template <typename... Rs> class object<GRP<Rs...> > {
};



// Regular function                  (does NOT work)
void takeobj(object<GRP<void> >& obj) { (void)obj; }

// Lambda - taking anything...       (only thing I could make WORK)
auto takeobj_lambda = [](auto obj) { (void)obj; };

// Template func - taking anything   (does NOT work)
template <typename T> void takeobj_templ_norm(T obj) { (void)obj; }
template <typename T> void takeobj_templ_clref(const T& obj) { (void)obj; }
template <typename T> void takeobj_templ_lref(T& obj) { (void)obj; }
template <typename T> void takeobj_templ_rref(T&& obj) { (void)obj; }


int main()
{
    object<GRP<void> > oval;

    //takeobj(oval);                  // <--    causes compile error

    takeobj_lambda(oval); // works

    //takeobj_templ_norm(oval);       // <--    also error
    //takeobj_templ_clref(oval);      // <--    also error
    //takeobj_templ_lref(oval);       // <--    also error
    //takeobj_templ_rref(oval);       // <--    also error
    return 0;
}

编辑:添加修剪的复制品:

#include <tuple>


// MAIN OBJECT (empty for forum question)
template <typename> class object;
template <typename... Rs> class object<std::tuple<Rs...> > {
};

// Regular function                  (does NOT work)
void takeobj(object<std::tuple<void> >& obj) { (void)obj; }

// Lambda - taking anything...       (only thing I could make WORK)
auto takeobj_lambda = [](auto obj) { (void)obj; };


int main()
{
    object<std::tuple<void> > oval;

    //takeobj(oval);                  // <--    causes compile error
    takeobj_lambda(oval); // works

    return 0;
}
TC

std::tuple<void>是一个关联类object<std::tuple<void>>,因此,在其中进行参数相关的查找不合格的呼叫,std::tuple<void>被实例化,以寻找任何friend可能已定义的内联函数。此实例导致错误。

如果被调用的事物未命名函数或函数模板,则不执行依赖于参数的查找。因此使用lambda作品-takeobj_lambda是一个对象。

如果您使用限定调用(::takeobj(oval))或括号takeobj(takeobj)(oval)),则将编译代码。这两个都禁用ADL。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ 11:从模板函数构建std :: tuple

来自分类Dev

STD :: Tuple实现C ++

来自分类Dev

我可以为C ++ 11 std :: tuple预先分配一块内存吗?

来自分类Dev

如何从C ++模板解压缩std :: tuple?

来自分类Dev

C ++ std :: tuple销毁顺序

来自分类Dev

std :: tuple作为模板参数?

来自分类Dev

我可以从向量数组初始化std :: tuple吗?

来自分类Dev

为什么我不能在constexpr lambda函数中使用std :: tuple

来自分类Dev

正确使用std :: tuple吗?

来自分类Dev

std :: is_same用于void函数(...)和void类型吗?

来自分类Dev

C ++将std :: tuple <char,char,char>转换为std :: string吗?

来自分类Dev

C ++ 14是否要求delete表达式必须调用`void operator :: delete(void *,std :: size_t)`而不是`void :: operator delete(void *)`?

来自分类Dev

我可以在运行时将std :: vector转换为std :: tuple吗?

来自分类Dev

C原语可以比void *宽吗?

来自分类Dev

是否有任何原因为何使用std :: tuple传递c ++模板包

来自分类Dev

C ++ 11 std :: forward_as_tuple和std :: forward

来自分类Dev

C++11 std::forward_as_tuple and std::forward

来自分类Dev

c ++ 11将std :: tuple解压缩为虚拟成员函数

来自分类Dev

所有的std :: tuple构造函数都是必需的吗?

来自分类Dev

为什么不能用兼容类型的std :: tuple来按元素构造std :: tuple?

来自分类Dev

为什么不能用兼容类型的std :: tuple来按元素构造std :: tuple?

来自分类Dev

在std :: tuple上“迭代”并可以访问所有构造函数

来自分类Dev

我们不能从initializer_list创建std :: array,但是可以使用带有可变参数的辅助函数来创建它吗?

来自分类Dev

我们不能从initializer_list创建std :: array,但是我们可以使用带有可变参数的辅助函数来创建它吗?

来自分类Dev

C ++中的可调用类对象:没有匹配的函数来调用'std :: tuple <T> :: tuple(<括号包围的初始化程序列表>)'

来自分类Dev

没有合适的构造函数可以从void转换为std:thread

来自分类常见问题

我们可以在C语言中将(void *)0称为void指针吗?

来自分类Dev

我们可以在C语言中将(void *)0称为void指针吗?

来自分类Dev

如何在C ++ 11中迭代std :: tuple

Related 相关文章

  1. 1

    C ++ 11:从模板函数构建std :: tuple

  2. 2

    STD :: Tuple实现C ++

  3. 3

    我可以为C ++ 11 std :: tuple预先分配一块内存吗?

  4. 4

    如何从C ++模板解压缩std :: tuple?

  5. 5

    C ++ std :: tuple销毁顺序

  6. 6

    std :: tuple作为模板参数?

  7. 7

    我可以从向量数组初始化std :: tuple吗?

  8. 8

    为什么我不能在constexpr lambda函数中使用std :: tuple

  9. 9

    正确使用std :: tuple吗?

  10. 10

    std :: is_same用于void函数(...)和void类型吗?

  11. 11

    C ++将std :: tuple <char,char,char>转换为std :: string吗?

  12. 12

    C ++ 14是否要求delete表达式必须调用`void operator :: delete(void *,std :: size_t)`而不是`void :: operator delete(void *)`?

  13. 13

    我可以在运行时将std :: vector转换为std :: tuple吗?

  14. 14

    C原语可以比void *宽吗?

  15. 15

    是否有任何原因为何使用std :: tuple传递c ++模板包

  16. 16

    C ++ 11 std :: forward_as_tuple和std :: forward

  17. 17

    C++11 std::forward_as_tuple and std::forward

  18. 18

    c ++ 11将std :: tuple解压缩为虚拟成员函数

  19. 19

    所有的std :: tuple构造函数都是必需的吗?

  20. 20

    为什么不能用兼容类型的std :: tuple来按元素构造std :: tuple?

  21. 21

    为什么不能用兼容类型的std :: tuple来按元素构造std :: tuple?

  22. 22

    在std :: tuple上“迭代”并可以访问所有构造函数

  23. 23

    我们不能从initializer_list创建std :: array,但是可以使用带有可变参数的辅助函数来创建它吗?

  24. 24

    我们不能从initializer_list创建std :: array,但是我们可以使用带有可变参数的辅助函数来创建它吗?

  25. 25

    C ++中的可调用类对象:没有匹配的函数来调用'std :: tuple <T> :: tuple(<括号包围的初始化程序列表>)'

  26. 26

    没有合适的构造函数可以从void转换为std:thread

  27. 27

    我们可以在C语言中将(void *)0称为void指针吗?

  28. 28

    我们可以在C语言中将(void *)0称为void指针吗?

  29. 29

    如何在C ++ 11中迭代std :: tuple

热门标签

归档