C++:调用 tuple_transpose 函数时没有匹配的函数调用

标签 c++ templates c++11 tuples

我正在尝试将一个 vector 元组更改为一个元组 vector (反之亦然)。我在调用 tuple_transpose 函数时遇到问题。当我用一个参数调用它时,我得到一个 no matching function call 错误:

prog.cpp: In function ‘int main()’:
prog.cpp:44:24: error: no matching function for call to ‘tuple_transpose(std::tuple >, std::vector > >&)’
prog.cpp:44:24: note: candidates are:
prog.cpp:30:6: note: template typename transpose::type tuple_transpose(std::tuple >...>&, seq)
prog.cpp:30:6: note: template argument deduction/substitution failed:
prog.cpp:44:24: note: candidate expects 2 arguments, 1 provided
prog.cpp:36:6: note: template typename transpose::type tuple_transpose(std::tuple >...>&)
prog.cpp:36:6: note: template argument deduction/substitution failed:
prog.cpp: In substitution of ‘template typename transpose::type tuple_transpose(std::tuple >...>&) [with T = {int, bool}]’:
prog.cpp:44:24: required from here
prog.cpp:36:6: error: no type named ‘type’ in ‘struct transpose >, std::vector > >&>’

#include <vector>
#include <tuple>
#include <type_traits>

template <typename... T>
struct transpose {};

template <typename... T>
struct transpose<std::tuple<std::vector<T>...>>
{
    using type = std::vector<std::tuple<T...>>;
};

template <typename... T>
struct transpose<std::vector<std::tuple<T...>>>
{
    using type = std::tuple<std::vector<T>...>;
};

// Indicies from Andy Prowl's answer
template <int... Is>
struct seq {};

template <int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> {};

template <int... Is>
struct gen_seq<0, Is...> : seq<Is...> {}; 

template <typename... T, int... Is>
auto tuple_transpose(std::tuple<std::vector<T>...>& var, seq<Is...>) -> typename transpose<decltype(var)>::type
{
    return { std::make_tuple(std::get<Is>(var)...) };
}

template <typename... T>
auto tuple_transpose(std::tuple<std::vector<T>...>& var) -> typename transpose<decltype(var)>::type
{
    return tuple_transpose(var, gen_seq<sizeof...(T)>{});
}

int main()
{
    std::tuple<std::vector<int>, std::vector<bool>> var;
    tuple_transpose(var); // error
    ...
}

这是一个包含错误的演示:http://ideone.com/7AWiQQ#view_edit_box

我做错了什么,我该如何解决?谢谢。

最佳答案

如果您假设 vector 大小相同,这应该可以完成工作:

template <int... Is>
struct seq {};

template <int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> {};

template <int... Is>
struct gen_seq<0, Is...> : seq<Is...> {};

template <typename... T, int... Is>
auto transpose(std::tuple<std::vector<T>...>& var, seq<Is...>)
    -> std::vector<std::tuple<T...>>
{
    std::vector<std::tuple<T...>> result;
    for (std::size_t i = 0; i < std::get<0>(var).size(); i++)
    {
        std::tuple<T...> t = std::make_tuple(std::get<Is>(var)[i]...);
        result.push_back(t);
    }

    return result;
}

template <typename... T, int... Is>
auto transpose(std::tuple<std::vector<T>...>& var)
    -> std::vector<std::tuple<T...>>
{
    return transpose(var, gen_seq<sizeof...(T)>());
}

下面是您可以如何测试它:

#include <iostream>
#include <iomanip>

int main()
{
    std::vector<int> vi = {42, 1729, 6};
    std::vector<bool> vb = {true, false, false};
    std::vector<std::string> vs = {"Hi", "Hey", "Ho"};

    auto t = make_tuple(vi, vb, vs);
    auto v = transpose(t);

    std::cout << std::boolalpha;
    for (auto const& t : v)
    {
        std::cout << "(";
        std::cout << std::get<0>(t);
        std::cout << ", " << std::get<1>(t);
        std::cout << ", " << std::get<2>(t);
        std::cout << ")" << std::endl;
    }
}

最后,一个 live example .

关于C++:调用 tuple_transpose 函数时没有匹配的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16576321/

相关文章:

c++ - 虚拟继承中派生类的大小

c++ - 将 Nsight 设置为与现有 Makefile 项目一起运行

c++ - 如何将特定大小的数组作为参数传递?

c++ - 为什么 C++11 类型特征不是别名模板?

templates - 如何获取 Elasticsearch 5.x 中的搜索模板列表?

c++ - 忽略模板特化并显式使用非特化模板 (std::vector<bool>)

CPP 文件中的 C++11 模板定义, undefined reference

c++ - 成员变量重置回 0

c++ - 我如何将 Javascript 正则表达式转换为 C++11 正则表达式

javascript - Jquery 选择在 Backbone 中的模板元素中不起作用