Работа со строкой до выполнения - PullRequest
1 голос
/ 29 октября 2010

У меня есть строка: B<T>::B() [with T = int]

Можно ли как-нибудь получить B<T> [with T = int] из этого до выполнения?:)

Упрощение: есть ли способ получить X & Y отдельно от статической строки XY, определенной как макрос препроцессора в любой форме до выполнения?

Ответы [ 2 ]

1 голос
/ 29 октября 2010

В текущем C ++ я не могу думать о способе разбить строку во время компиляции.Большинство трюков с шаблонами не работают на строковых литералах.Теперь я представляю, что вы хотите, чтобы это использовалось в каком-то механизме ведения журнала, и вы хотите избежать влияния выполнения разделения во время выполнения при каждом вызове метода.Если это так, рассмотрите возможность добавления функции, которая будет выполнять операцию, а затем в каждой функции a 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 );
   }
};

(я не проверял это, поэтому вам может понадобиться возиться с ней)

Это будет иметь некоторыевлияние времени выполнения, но только один раз для каждой функции.Также обратите внимание, что этот подход не является потокобезопасным: если два потока одновременно вызывают метод, который не был вызван ранее, возникнет условие состязания.

0 голосов
/ 29 октября 2010

это то, что вы хотели?

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