在 C++11 和 C++14 中,是否有替代 constexpr 的字符指针数组定义?
Are there alternatives to constexpr with character pointer array definitions in C++11 and C++14?
我有一些代码可以用来提供一个字符串列表而不是匹配枚举成员的名称,这样我就可以将使用这些名称的文本文件轻松解析为枚举。 (我实际上用宏自动生成它,但这是另一回事。)代码在现代编译器 运行 C++17 上运行良好,但我的目标平台之一不支持 C++17,我'我想提出一个适用于 C++14(最好是 C++11)的替代方案。当前代码为:
class A
{
enum MatchType { Linear, Square };
static constexpr const char * matchTypeStrings[ 2 ] = { "Linear", "Square" };
static const size_t matchTypeCount = 2;
};
我宁愿不给枚举全局范围,因为那永远不会结束,理想情况下我不想向其中一个 .cpp 文件添加任何东西(这当然会修复链接器错误,但我认为它不推荐用于 C++17 代码,并且无论如何都不会与我的宏一起使用)。我在想我是否可以创建一个可以 return 字符串值的成员函数,但我想不出一个巧妙的方法。
使用静态成员函数:
#include <cstdint>
#include <iostream>
class A
{
public:
enum MatchType { Linear, Square };
static const char * matchTypeStrings(MatchType type)
{
static const char * const matchTypeStrings[ 2 ] = { "Linear", "Square" };
return matchTypeStrings[type];
}
static const std::size_t matchTypeCount = 2;
};
int main()
{
std::cout << A::matchTypeStrings(A::Linear) << '\n';
std::cout << A::matchTypeStrings(A::Square) << '\n';
}
重要的是要注意这显然不是 constexpr,但是 GCC 和 Clang 设法生成启用优化的类似代码。 (在编译器资源管理器上:Your version, Static function)
我有一些代码可以用来提供一个字符串列表而不是匹配枚举成员的名称,这样我就可以将使用这些名称的文本文件轻松解析为枚举。 (我实际上用宏自动生成它,但这是另一回事。)代码在现代编译器 运行 C++17 上运行良好,但我的目标平台之一不支持 C++17,我'我想提出一个适用于 C++14(最好是 C++11)的替代方案。当前代码为:
class A
{
enum MatchType { Linear, Square };
static constexpr const char * matchTypeStrings[ 2 ] = { "Linear", "Square" };
static const size_t matchTypeCount = 2;
};
我宁愿不给枚举全局范围,因为那永远不会结束,理想情况下我不想向其中一个 .cpp 文件添加任何东西(这当然会修复链接器错误,但我认为它不推荐用于 C++17 代码,并且无论如何都不会与我的宏一起使用)。我在想我是否可以创建一个可以 return 字符串值的成员函数,但我想不出一个巧妙的方法。
使用静态成员函数:
#include <cstdint>
#include <iostream>
class A
{
public:
enum MatchType { Linear, Square };
static const char * matchTypeStrings(MatchType type)
{
static const char * const matchTypeStrings[ 2 ] = { "Linear", "Square" };
return matchTypeStrings[type];
}
static const std::size_t matchTypeCount = 2;
};
int main()
{
std::cout << A::matchTypeStrings(A::Linear) << '\n';
std::cout << A::matchTypeStrings(A::Square) << '\n';
}
重要的是要注意这显然不是 constexpr,但是 GCC 和 Clang 设法生成启用优化的类似代码。 (在编译器资源管理器上:Your version, Static function)