我有一个字符串:
B<T>::B() [with T = int]
我有什么方法可以得到
以某种方式在运行时之前从B<T> [with T = int]
开始? :)
简化:有没有办法获得X
&amp; Y
与在运行时之前以任何形式定义为预处理器宏的静态字符串XY
分开?
答案 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;