我有一个字符串:
B<T>::B() [with T = int]
我有什么办法
在运行前从这里B<T> [with T = int]
以某种方式? :)
简化:是否有任何方法可以在运行时之前,以任何形式将X
和Y
与定义为预处理程序宏的静态字符串XY
分开获取?
最佳答案
在当前的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 );
}
};
(我尚未对此进行测试,因此您可能需要摆弄它)
这将对运行时产生一些影响,但每个功能仅影响一次。还要注意,这种方法不是线程安全的:如果两个线程同时调用在出现竞争条件之前尚未被调用的方法。
关于c++ - 运行前对字符串进行操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4049669/