Я использую некоторые глобальные предварительно вычисленные строки constexpr для работы с типами. Я строю функцию:
// strfindCExpr and strlenCExpr are my constexpr methods for string manipulation
template<typename T>
static constexpr std::string_view getTypeName() {
constexpr auto p = __PRETTY_FUNCTION__;
constexpr auto pStart = strfindCExpr(p, strlenCExpr(p), "= ", 2) + 2;
constexpr auto pEnd = strfindCExpr(pStart, strlenCExpr(pStart), "]", 1);
return {pStart, pEnd - pStart};
}
Обычно эта функция правильно выдает значения при вызове с разными типами, т. Е. getTypeName<NSA::BlackList>() == "NSA::BlackList"
Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь использовать эти constexpr в глобальном пространстве имен.
Рабочая версия:
constexpr std::string_view myType = getTypeName<NSA::BlackList>();
// myType == "NSA::BlackList"
Не работает:
constexpr auto myType = getTypeName<NSA::BlackList>();
// myType == "der/Folder/Folder/File.cpp"
Как ни странно, когда я печатаю typeid (myType) .name (), в обеих версиях они заканчиваются на: NSt3__117basic_string_viewIcNS_11char_traitsIcEEEE.
Использование XCode версии 9.4.1, Apple LLVM 9.0
Это проблема времени выполнения:
constexpr std::string_view myTypeWorking = getTypeName<NSA::BlackList>();
constexpr auto myTypeNotWorking = getTypeName<NSA::BlackList>();
int main() {
assert(strncmp(myTypeWorking.data(), "NSA::BlackList", strlen("NSA::BlackList")) == 0); // Ok
assert(strncmp(myTypeNotWorking.data(), "NSA::BlackList", strlen("NSA::BlackList")) == 0); // Fail
constexpr auto myTypeLocalWorking = getTypeName<NSA::BlackList>();
assert(strncmp(myTypeLocalWorking.data(), "NSA::BlackList", strlen("NSA::BlackList")) == 0); // Ok
}