我有一个字符串:
B<T>::B() [with T = int]
我有什么办法
在运行前从这里B<T> [with T = int]以某种方式? :)

简化:是否有任何方法可以在运行时之前,以任何形式将XY与定义为预处理程序宏的静态字符串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/

10-11 22:44
查看更多