头文件中的字符串视图文字
String view literals in header file
我有一个 class 有一堆常量字符串,形式如下:
using namespace std::string_view_literals;
class T {
static const constexpr std::string_view something1 = "Alice"sv;
static const constexpr std::string_view something2 = "Bob"sv;
static const constexpr std::string_view something3 = "Charlie"sv;
...
};
我目前 using
string_view_literals
命名空间,但这在头文件中不是好的做法,并且会生成警告:
Using namespace directive in global context in header [-Wheader-hygiene]
(当当)
literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
(gcc7)
我想看看其他选项。
忽略警告
直接导入我正在使用的一个文字,而不是整个命名空间
using std::string_view_literals::operator""sv
因为这是一个 constexpr 常量,也许我应该直接调用构造函数,知道它没有运行时内存或 CPU 开销:
static const constexpr something1 = std::string_view("Alice");
还有别的吗?
这很短,不会污染任何东西:
class T {
using sv = std::string_view;
static constexpr auto something1 = sv("Alice");
static constexpr auto something2 = sv("Bob");
static constexpr auto something3 = sv("Charlie");
};
如果你真的想使用文字,你可以将你的 class 包装在另一个不打算命名的 namespace
中,然后将它带回外部命名空间:
namespace _private {
using namespace std::string_view_literals;
class T {
static constexpr auto something1 = "Alice"sv;
static constexpr auto something2 = "Bob"sv;
static constexpr auto something3 = "Charlie"sv;
};
}
using _private::T;
注意写static constexpr const
是多余的。 constexpr
变量隐式 const
.
我有一个 class 有一堆常量字符串,形式如下:
using namespace std::string_view_literals;
class T {
static const constexpr std::string_view something1 = "Alice"sv;
static const constexpr std::string_view something2 = "Bob"sv;
static const constexpr std::string_view something3 = "Charlie"sv;
...
};
我目前 using
string_view_literals
命名空间,但这在头文件中不是好的做法,并且会生成警告:
Using namespace directive in global context in header [-Wheader-hygiene]
(当当)
literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
(gcc7)
我想看看其他选项。
忽略警告
直接导入我正在使用的一个文字,而不是整个命名空间
using std::string_view_literals::operator""sv
因为这是一个 constexpr 常量,也许我应该直接调用构造函数,知道它没有运行时内存或 CPU 开销:
static const constexpr something1 = std::string_view("Alice");
还有别的吗?
这很短,不会污染任何东西:
class T {
using sv = std::string_view;
static constexpr auto something1 = sv("Alice");
static constexpr auto something2 = sv("Bob");
static constexpr auto something3 = sv("Charlie");
};
如果你真的想使用文字,你可以将你的 class 包装在另一个不打算命名的 namespace
中,然后将它带回外部命名空间:
namespace _private {
using namespace std::string_view_literals;
class T {
static constexpr auto something1 = "Alice"sv;
static constexpr auto something2 = "Bob"sv;
static constexpr auto something3 = "Charlie"sv;
};
}
using _private::T;
注意写static constexpr const
是多余的。 constexpr
变量隐式 const
.