【问题标题】:Operating on a string before runtime在运行前对字符串进行操作
【发布时间】:2010-10-29 06:58:39
【问题描述】:

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

有什么办法可以得到 B<T> [with T = int] 在运行时间之前不知何故? :)

简化:有什么方法可以将XY 与在运行前以任何形式定义为预处理器宏的静态字符串XY 分开获取?

【问题讨论】:

  • 您希望 函数 B() 返回一个字符串,其内容是“B [with T = int]”,并且您希望它可用在编译期间?
  • 实际上B 的构造函数用__PRETTY_FUNCTION__ 给出了该字符串。我想要的是把它切碎。
  • nvm,发现是可以的。 boost::mpl::string 应该可以 - 所以我得调查一下。
  • 再想一想,也许不是。 :(

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


【解决方案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 );
   }
};

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

这会产生一些运行时影响,但每个函数只有一次。另请注意,这种方法不是线程安全的:如果两个线程同时调用一个之前没有被调用过的方法,就会出现竞争条件。

【讨论】:

    【解决方案2】:

    这是你想要的吗?

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

    【讨论】:

    • 没有。如果您以另一种方式进行 - 即,将 XY 分解为 XY,那就太好了。
    • @nakiya:我的意思是,既然你控制了源代码,效果是一样的
    猜你喜欢
    • 2013-02-26
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多