Передача пакета параметров C ++ в std :: map приводит к ошибке C3245 - PullRequest
0 голосов
/ 29 октября 2019

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

main.cpp(36): error C3245: 'funcMapA': use of a variable template requires template argument list
main.cpp(23): note: see declaration of 'funcMapA'

Вот мой минимальный (не) рабочий пример:

#include <functional>
#include <map>
#include <string>
#include <sstream>
#include <iostream>
#include <iterator>
#include <vector>
#include <utility>

void DoStuff_1(int i) {
  std::cout << "DoStuff_1 " << i << "\n";
}

void DoStuff_2(int i, int k) {
  std::cout << "DoStuff_2 " << i << ", " << k << "\n";
}

void DoStuff_3(int i, int k, int l) {
  std::cout << "DoStuff_3 " << i << ", " << k << ", " << l << "\n";
}

template <typename ... Ts>
std::map<std::string, std::function<void(Ts&& ... args)>> funcMapA = {
  {"DoStuff_1", [](Ts&& ... args) {DoStuff_1(std::forward<Ts>(args)...); }},
  {"DoStuff_2", [](Ts&& ... args) {DoStuff_2(std::forward<Ts>(args)...); }},
  {"DoStuff_3", [](Ts&& ... args) {DoStuff_3(std::forward<Ts>(args)...); }}
};

std::map<std::string, std::function<void(int, int, int)>> funcMapB = {
  {"DoStuff_1", [](int x, int y, int z) {DoStuff_1(x); }},
  {"DoStuff_2", [](int x, int y, int z) {DoStuff_2(x, y); }},
  {"DoStuff_3", [](int x, int y, int z) {DoStuff_3(x, y, z); }}
};

int main(int argc, char** argv) {
  funcMapA["DoStuff_" + std::to_string(3)](1, 2, 3); //Failing
  funcMapB["DoStuff_" + std::to_string(3)](1, 2, 3); //Working
  getchar();
  return 0;
}

Как мне заставить это (funcMapA) работать?

1 Ответ

0 голосов
/ 29 октября 2019

Есть 2 проблемы:

Во-первых: вы должны предоставить аргументы шаблона следующим образом:

funcMapA<int,int,int>["DoStuff_" + std::to_string(3)](1, 2, 3);

Во-вторых: Но если вы сделаете это, реализация вашего шаблона потерпит неудачу, потому что:

{"DoStuff_1", [](Ts&& ... args) {DoStuff_1(std::forward<Ts>(args)...); }},
{"DoStuff_2", [](Ts&& ... args) {DoStuff_2(std::forward<Ts>(args)...); }},
{"DoStuff_3", [](Ts&& ... args) {DoStuff_3(std::forward<Ts>(args)...); }}

вы пересылаете 3 аргумента DoStuff1 и DoStuff2, что не то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...