Аргументы шаблона могут оценивать параметр массива c, но не std :: array - PullRequest
0 голосов
/ 03 марта 2020

Я ввожу массив строк в функцию, чтобы оценить вывод с вектором одинаковой длины. Основной причиной этого является то, что структурированные привязки могут использоваться на выходе следующим образом:

#include <vector>
#include <array>
#include <string>

template <std::size_t N>
void get_array_vals_impl(std::string(&& valueNames)[N], std::vector<std::array<std::string, N>>& results)
{
    // populates results. Passed in as param as it is called recursively iterating over a directory
}

template <std::size_t N>
std::vector<std::array<std::string, N>> get_array_vals(std::string(&& valueNames)[N])
{
    std::vector<std::array<std::string, N>> res;
    get_array_vals_impl(valueNames, res);
    return res;
}

template <std::size_t N>
std::vector<std::array<std::string, N>> get_array_vals(std::string(&valueNames)[N])
{
    return get_array_vals(valueNames);
}

int main()
{
    using namespace std::string_literals;

    auto res1 = get_array_vals({ "test"s, "second_arg"s });

    for (auto const& [first, second] : res1)
    {
        // use first and second accordingly. compile-time errors if structured binding length
        // doesn't match the length of the input arguments.
    }

    std::string another_test[] = { "hi", "hello" };

    auto res2 = get_array_vals(another_test); // also works fine
}

Однако, когда я пытаюсь использовать std :: array в качестве входных данных, происходит сбой с no instance of overloaded function "get_array_vals" matches the argument list. почему в этом случае нельзя оценить std::array<std::string, 2>? Мне действительно нужно добавить еще одну перегрузку для этого экземпляра?

...