我想std::function<void()>在初始化地圖時用作型別名:
namespace kc
{
class kcmessage
{
private:
std::string value;
void warning() {}
void error()
{
exit(1);
}
std::map<std::string, std::function<void()>> msgtypes = {
{ "WARNING", warning },
{ "ERROR", error }
};
int msgtype;
};
}
但它不作業:error: could not convert ‘{{"WARNING", ((kc::kcmessage*)this)->kc::kcmessage::warning}, {"ERROR", ((kc::kcmessage*)this)->kc::kcmessage::error}}’ from ‘<brace-enclosed initializer list>’ to ‘std::map<std::__cxx11::basic_string<char>, std::function<void()> >’(<brace-enclosed initializer list>)
uj5u.com熱心網友回復:
如果要訪問成員函式(非靜態),則必須將該方法系結到類的實體。為此,您可以使用std::bind,但為此目的簡單地使用 lambda 會容易得多。
#include <functional>
#include <map>
#include <string>
#include <iostream>
namespace kc
{
class kcmessage
{
private:
std::string value;
void warning() {std::cout << "Waring called!"<<std::endl;}
void error()
{
std::cout << "Error called" << std::endl;
//exit(1);
}
std::map<std::string, std::function<void()>> msgtypes = {
{ "WARNING", [this](){ warning();} },
{ "ERROR", [this](){ error();} }
};
int msgtype;
public:
void CallAll()
{
for( auto& el: msgtypes)
{
el.second();
}
}
};
}
int main()
{
kc::kcmessage{}.CallAll();
}
在這里執行
您可以使您的方法也成為方法static,但在這種情況下,如果需要,您將無法再訪問您的成員資料,這通常是這種情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/418485.html
標籤:
上一篇:***尚未宣告(盡管已宣告)
