有没有办法通过
std::map<std::string, float>
Run Code Online (Sandbox Code Playgroud)
作为宏的论据?
(问题是宏用来分割","
std::map<std::string
Run Code Online (Sandbox Code Playgroud)
和
float>
Run Code Online (Sandbox Code Playgroud)
作为单独的论点.我想避免这个.
是的,有一种方法,但它是间接的.
正如你所说,宏观在解释中相当愚蠢.但它仍然可以识别括号.
例: BOOST_MPL_ASSERT((boost::is_same<int,int>))
它通过使用另一级括号来工作,从而形成Tuple(从宏观角度来看).
如果您使用Boost.Preprocessor库,则可以轻松地"解包"a Tuple以使其内容毫发无损.不幸的是,你应该先了解一个元组的大小,所以你需要一个额外的参数
#define MY_MACRO(Size, TemplatedType, Name)\
BOOST_PP_TUPLE_REM(Size)(TemplatedType) Name
Run Code Online (Sandbox Code Playgroud)
并在行动:
MY_MACRO(2, (std::map<int,std::string>), idToName);
// expands to 'std::map<int,std::string> idToName'
idToName[1] = "Smith";
Run Code Online (Sandbox Code Playgroud)
所以,是的,这是可能的,但宏必须明确定制来处理它.
一种不优雅的解决方法是将逗号“隐藏”在另一个宏中
#define ARGUMENT std::map<std::string, float>
YOUR_MACRO(ARGUMENT)
#undef ARGUMENT
Run Code Online (Sandbox Code Playgroud)
但是,如果YOUR_MACRO它本身需要将其向下传播到另一个宏中,则会遇到同样的问题。