Как получить переменное количество аргументов неизвестного определенного типа? - PullRequest
1 голос
/ 14 апреля 2020

Я действительно не знаю, как правильно называть это, так что извините за то, что я написал. Я думаю, что лучше всего показать на примере.

void foo(std::pair<std::string, T>, std::pair<std::string, U>, std::pair<std::string, Z>, ...);

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

template<typename ...args>
void foo(args... values);
//the following isn't allowed, cause it doesn't know the type. (this is what I want it to look like)
foo({"hi",5}, {"hello", true});

Возможно ли это вообще? что я пытаюсь сделать? Любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 14 апреля 2020

Начиная с C ++ 17, вы можете использовать CTAD ( Удержание аргумента шаблона класса ) и использовать std::string s operator""s, чтобы иметь

template<typename ...args>
void foo(args... values) {}
// or to make sure pair types are provided
//template<typename ...args>
//void foo(std::pair<std::string, args>... values) {}

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

    foo(pair{"hi"s, 5}, pair{"hello"s, true});
}
1 голос
/ 14 апреля 2020

Вы можете сделать следующее для ограничения параметра на пары:

template<typename ...Ts>
void foo(std::pair<std::string, Ts>... values);

Вызов должен быть похож на:

foo(std::pair{std::string("hi"),5}, std::pair{std::string("hello"), true});
foo<int, bool>({"hi",5}, {"hello", true});

{"hi",5} не имеет типа, поэтому не может позволить вывести тип шаблона. В этом случае вы должны предоставить параметр шаблона.

Если вы предоставите правильные пары (std::pair<std::string, T>, а не std::pair<const char*, T>), тогда может произойти удержание.

...