こんにちは。
ラムダ式のシグニチャが既知なら下記で行けると思います。
でも、std::functionと基本のアイデアは大差ないだろうと思いますので、素直にstd::functionを使った方が好ましいような気がします。
boost::anyのアイデアを使ってます。
C++
1//https://teratail.com/questions/55961
2#include <memory>
3#include <iostream>
4#include <string>
5#include <unordered_map>
6
7class FuncHolder
8{
9 struct HolderBase
10 {
11 virtual ~HolderBase() { }
12 virtual void func(int x, int y) const=0;
13 };
14
15 template<typename tFunc>
16 class Holder : public HolderBase
17 {
18 tFunc mFunc;
19 public:
20 Holder(tFunc iFunc) : mFunc(iFunc) { }
21 ~Holder() = default;
22
23 virtual void func(int x, int y) const
24 {
25 mFunc(x, y);
26 }
27 };
28
29 std::unique_ptr<HolderBase> mHolder;
30public:
31 template<typename tFunc>
32 FuncHolder(tFunc iFunc) : mHolder(new Holder<tFunc>(iFunc)) { }
33
34 void func(int x, int y) const
35 {
36 mHolder->func(x, y);
37 }
38};
39
40int main()
41{
42 std::unordered_map<std::string,FuncHolder> map;
43 map.emplace(std::to_string(0), [](int x, int y){std::cout << x << ", " << y << "\n";});
44 map.emplace(std::to_string(1), [](int x, int y){std::cout << x << ", " << y << "\n";});
45 map.emplace(std::to_string(2), [](int x, int y){std::cout << x << ", " << y << "\n";});
46
47 int x=10;
48 int y=100;
49 for (auto&& item : map)
50 {
51 std::cout << item.first << " : ";
52 item.second.func(x++, y++);
53 }
54
55 return 0;
56}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/21 08:33