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