c++在存储指针元组时遇到问题

标签 c++ c++11 variadic-templates

我有一个对象“S”,它存储一个简单的指针元组,它通过使用可变参数模板变得灵活。有两种方法,store() 和 store2()。第一个(商店)工作正常。第二个不会编译,因为 std::make_tuple 失败并出现错误:

'没有匹配函数来调用'make_tuple'

它进一步补充说,对于第一个参数,没有从“B*”到“B*&&”的已知对话(这个错误在元组库头中很深)。

代码在这里:

#include <tuple>
#include <utility>

template<typename...Rs>
struct S
{
    void store(std::tuple<Rs*...> rs)
    {
        rs_ = rs;
    }

    void store2(Rs*...rs)
    {
        rs_ = std::make_tuple<Rs*...>(rs...); // This is the guy that breaks
    }

private:
    std::tuple<Rs*...> rs_;
};

struct B
{};

struct A : S<B, B>
{};

int main()
{
    auto *b1 = new B;
    auto *b2 = new B;
    auto *a1 = new A;

    a1->store(std::make_tuple(b1, b2));   // This works
    a1->store2(b1, b2);    // How can I get this to work?
                           // (It causes an error in std::make_tuple of store2 above)
}

最佳答案

这是一个错误,因为 make_tuple ,如 C++11 或更高版本 make_pair , 采用转发引用,并且当您显式指定非引用的模板参数时,这些转发引用将成为右值引用。

所以 make_tuple<Rs*...>tuple<Rs*...> make_tuple(Rs*&&...) - 参数类型都是右值引用,不绑定(bind)到左值(并且 rs... 扩展为左值列表)。

整点这些make_meow函数是为了避免必须写出显式模板参数,所以...不要写它们。

关于c++在存储指针元组时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36975226/

相关文章:

c++ - 非递归获取可变参数模板最后类型的通用类型特征?

c++ - 构造函数的类模板参数包扩展

templates - 为什么使用可变参数模板参数初始化我的对象需要定义移动构造函数?

c++ - 简单程序 - 菜单只显示一次

c++ - 我可以在 iOS 中将 Swift 应用程序与 C++ 应用程序 (Vuforia) 合并吗?

c++ 将数据添加到包含 std::tuple 的 std::vector

C++11 Code::Blocks GCC 在编译依赖成员结构的可变参数模板时崩溃

c++ - 复制初始化表单 '= {}'

C++:虚拟指针的原型(prototype)

c++ - 以下代码不会对 Stdout 做出任何响应