C预处理器在字符串文字中插入/追加标记

时间:2016-11-01 14:24:40

标签: c++ c++11 c-preprocessor

我有以下宏:

#define ASSERT_ITERATOR_VALUE_TYPE(Iterator__, Value_type__)                      \
static_assert(std::is_same<Value_type__, typename Iterator__::value_type>::value, \
              "Expected iterator with value type #Value_type__")

在上面的宏中,我试图将Value_type__标记作为static_assert中的第二个输入参数插入/追加到字符串文字中。

显然,这不是我想要实现的目标,因为如果我将宏声明为:

ASSERT_ITERATOR_VALUE_TYPE(std::set<int>::iterator, double);

我会收到消息:

error: static assertion failed: Expected iterator with value type #Value_type__
                                                                  ^^^^^^^^^^^^^

相反,我想接收消息:

error: static assertion failed: Expected iterator with value type double
                                                                  ^^^^^^

Live Demo

Q

是否有某种预处理器巫术可以帮助我实现我的目标?

1 个答案:

答案 0 :(得分:9)

#define ASSERT_ITERATOR_VALUE_TYPE(Iterator__, Value_type__)                      \
static_assert(std::is_same<Value_type__, typename Iterator__::value_type>::value, \
              "Expected iterator with value type " #Value_type__)

将宏参数扩展为字符串文字,然后依赖字符串文字连接。