我正在尝试将函数指针与结构一起存储在地图中。当我在结构中找到特定值时,我们的想法是执行相应的功能。当我试图通过std :: make_pair将数据插入到地图中时,程序没有编译,并且给了我很多错误。这是我写的代码。请指导我在这里做错了什么..
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
struct _timeset
{
int hr1;
int min1;
int secs1;
};
_timeset t1 = { 17, 10, 30 };
void fun1(void)
{
std::cout << "inside fun1\n";
}
void fun2(void)
{
std::cout << "inside fun2\n";
}
void fun3(void)
{
std::cout << "inside fun3\n";
}
std::map<_timeset, void(*)()> m1;
int main()
{
m1.insert(std::make_pair(t1, fun1)); //Compiling errors here
return 0;
}
我在STL的基础很差。我正在使用VS2013编译器。 同样在迭代地图时,我可以用以下内容执行相关功能:
std::map<_timeset, void(*)()>::iterator it1;
int i = 0;
for (i=0,it1 = m1.begin(); it1 != m1.end(); it1++,i++)
{
_timeset _t = it1->first;
//Check Values in _t, and then execute the corresponding function in the map
(*it1->second)();
}
非常感谢,
答案 0 :(得分:4)
您需要为_timeset
std::map
指定比较器才能生效,例如:
struct _timeset
{
int hr1;
int min1;
int secs1;
bool operator<( const _timeset &t ) const {
return std::make_tuple( hr1, min1, secs1 ) < std::make_tuple( t.hr1, t.min1, t.secs1 );
}
};
或者您可以将其设为lamba,如here
所述同样在迭代地图时,我可以用
之类的东西执行相关的功能
是的,你可以,也不必复制struct _timeset
:
int i = 0;
for ( it1 = m1.begin(); it1 != m1.end(); it1++,i++)
{
const _timeset &_t = it1->first;
//Check Values in _t, and then execute the corresponding function in the map
(*it1->second)();
}
如果要存储具有不同签名的函数,请使用std::function
:
typedef std::function<void()> func;
std::map<_timeset, func> m1;
void fun1();
void func2( int );
struct foobar { void func3(); };
m1.insert( std::make_pair( t, func1 ) ); // signature matches, no need for bind
m1.insert( std::make_pair( t, std::bind( func2, 123 ) ) ); // signature does not match func2(123) will be called
foobar *pf = ...;
m1.insert( std::make_pair( t, std::bind( func3, pf ) ) ); // signature does not match, pf->func3() will be called
// etc