C++ 将参数包传递给 std::map 导致错误 C3245
C++ pass parameter pack to std::map results in error C3245
我尝试调用保留在映射中的函数(以实现反射),并将传递的参数作为参数包传递,这可能看起来有点奇怪。无论如何,我都想把它写到 运行。目前我遇到以下错误:
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) 工作?
有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)...); }}
您向 DoStuff1 和 DoStuff2 转发了 3 个参数,这不是您想要的。
我尝试调用保留在映射中的函数(以实现反射),并将传递的参数作为参数包传递,这可能看起来有点奇怪。无论如何,我都想把它写到 运行。目前我遇到以下错误:
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) 工作?
有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)...); }}
您向 DoStuff1 和 DoStuff2 转发了 3 个参数,这不是您想要的。