2010-10-29 4 views
1

У меня есть строка: B<T>::B() [with T = int]Работая на строке перед выполнением

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

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

+0

Вы хотите, чтобы функция * 'B()' возвращала строку, у кого есть «B [с T = int]», и вы хотите, чтобы это было доступно во время компиляции? –

+0

На самом деле конструктор 'B' дает эту строку с' __PRETTY_FUNCTION__'. Я хочу, чтобы его нарезать. – nakiya

+0

nvm, выяснили, что это возможно. 'boost :: mpl :: string' якобы может - так что я должен буду изучить это. – nakiya

ответ

1

В текущем 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

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

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

Нет. Если вы сделали это другим способом - то есть, разложив 'XY' на' X' и 'Y', это было бы здорово. – nakiya

+0

@nakiya: Я хочу сказать, поскольку вы контролируете исходный код, эффект будет таким же –

Смежные вопросы