这是一个C ++ 03问题。
在以下代码中,class Foo
实现了operator[]
,它返回指向成员函数的指针。该代码目前通过返回TFunc
的引用来执行此操作,typedef
是operator[]
成员函数。
我想学习:如果不使用typedef
,typedef
定义的语法是什么?你可以看到我徘徊了一下,没有成功,尝试。我的第一个想法是#include <iostream>
#include <map>
#include <string>
template <typename T>
class Foo
{
public:
typedef void (T::*TFunc)( const std::string&, const std::string& );
typedef std::map< std::string, TFunc > FooMap;
operator FooMap&()
{
return member_;
}
//void (T::*)( const std::string&, const std::string& ) operator []( const std::string& str )
//void (T::*&)( const std::string&, const std::string& ) operator []( const std::string& str )
//void (T::*)&( const std::string&, const std::string& ) operator []( const std::string& str )
//void (T::*)( const std::string&, const std::string& )& operator []( const std::string& str )
TFunc& operator []( const std::string& str )
{
return member_[ str ];
}
private:
FooMap member_;
};
class Bar
{
public:
void func()
{
fb_["a"] = &Bar::abc;
}
void callFunc( const std::string& str, const std::string arg1,
const std::string& arg2 )
{
(this->*fb_[ str ])( arg1, arg2 );
}
void abc( const std::string& key, const std::string& val )
{
std::cout << key << ": " << val << std::endl;
}
private:
Foo<Bar> fb_;
};
int main( int argc, char* argv[] )
{
Bar b;
b.func();
b.callFunc( "a", "hello", "world" );
return 0;
}
像宏一样工作,即简单的字符串替换应该起作用 - 但显然不行。我试过的所有其他变种都没有。
process (state)--(CLK, reset,ADD,SHIFT,LOAD,STOP,STRT,LSB)
答案 0 :(得分:4)
丑陋的语法是:
void (T::*&operator [](const std::string& str))(const std::string&, const std::string&);
答案 1 :(得分:3)
在C ++ 14或更高版本中,您可以使用
decltype(auto)
作为返回类型
您也可以考虑使用std:: function
代替您当前拥有的地图的值类型。