C++宏和模板

ano*_*non 5 c++ macros

有没有办法通过

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)

作为单独的论点.我想避免这个.

Mar*_*n B 7

不,没有办法做到这一点,没有使用typedef.例如,BOOST_FOREACH遇到了同样的问题.


Tot*_*nga 6

尝试使用模板而不是宏.

Scott Meyers:有效的C++第2项:更喜欢#defines的consts,enums和inline


Mat*_* M. 5

是的,有一种方法,但它是间接的.

正如你所说,宏观在解释中相当愚蠢.但它仍然可以识别括号.

例: 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)

所以,是的,这是可能的,但宏必须明确定制来处理它.


AnT*_*AnT 2

一种不优雅的解决方法是将逗号“隐藏”在另一个宏中

#define ARGUMENT std::map<std::string, float> 
YOUR_MACRO(ARGUMENT)
#undef ARGUMENT
Run Code Online (Sandbox Code Playgroud)

但是,如果YOUR_MACRO它本身需要将其向下传播到另一个宏中,则会遇到同样的问题。