在运行时之前在字符串上操作

时间:2010-10-29 06:58:40

标签: c++ templates g++ c-preprocessor

我有一个字符串:    B<T>::B() [with T = int]

我有什么方法可以得到    以某种方式在运行时之前从B<T> [with T = int]开始? :)

简化:有没有办法获得X&amp; Y与在运行时之前以任何形式定义为预处理器宏的静态字符串XY分开?

2 个答案:

答案 0 :(得分:1)

在当前的C ++中,我无法想到在编译时拆分字符串的方法。大多数模板技巧都不适用于字符串文字。现在,我想您希望在某种日志记录机制中使用它,并且您希望避免在每次方法调用中在运行时执行拆分的影响。如果是这种情况,请考虑添加一个将执行操作的函数,然后在每个函数中添加static const std::string来保存该值。该字符串将在第一次调用函数时初始化一次:

#define DEFINE_LOG_NAME static const std::string _function_name( parse( __PRETTY_FUNCTION__ ) )
#define LOG_NAME( level ) do { DEFINE_LOG_NAME; log( level, _function_name ); } while (0)
std::string parse( std::string const & pretty ) {
   // split here, return value
}
template <typename T>
struct B {
   B() {
      LOG_NAME( DEBUG );
   }
};

(我没有测试过这个,所以你可能需要摆弄它)

这会产生一些运行时影响,但每个函数只有一次。另请注意,此方法不是线程安全的:如果两个线程同时调用一个尚未调用的方法,则会出现争用条件。

答案 1 :(得分:0)

这就是你想要的吗?

#define X "X"
#define Y "Y"
#define XY string(X) + Y
static string s = XY;