В текущем 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);
}
};
(я не проверял это, так что вам, возможно, придется возиться с ним)
Это будет иметь некоторое влияние во время выполнения, но только один раз для каждой функции. Также обратите внимание, что этот подход не является потокобезопасным: если два потока одновременно вызывают метод, который не был вызван до того, как будет состояние гонки.
Вы хотите, чтобы функция * 'B()' возвращала строку, у кого есть «B [с T = int]», и вы хотите, чтобы это было доступно во время компиляции? –
На самом деле конструктор 'B' дает эту строку с' __PRETTY_FUNCTION__'. Я хочу, чтобы его нарезать. – nakiya
nvm, выяснили, что это возможно. 'boost :: mpl :: string' якобы может - так что я должен буду изучить это. – nakiya