[英]How to check conditions on a string literal at compile time passed inside a class?
我希望能够将字符串文字传递给 class 实例,并在编译时检查字符串文字的某些条件。 但我希望 class 以某种方式完成字符串检查。 我有一个示例代码,大致是我想要实现的目标:
#include <type_traits>
#include <string>
#include <string_view>
class TestString
{
public:
constexpr bool TestStringCondition(const char* name) noexcept
{
return std::string_view(name).find('a') != std::string_view::npos; //random condition
}
constexpr TestString(const char* name) noexcept:
m_name(name)
{
static_assert(TestStringCondition(name), "error message");
}
const char* m_name = nullptr;
};
int main()
{
static constexpr const char* const name = {"foo"};
static const TestString testString { name };
}
我尝试了各种选项(模板、char_traits 等),但不断收到编译器错误“static_assert 表达式不是整数常量表达式”。 似乎对作为参数传递的 stringliteral 不满意,因为我可以在 class 之外进行断言检查。 我还不能使用任何 c++20 功能,我想要一种避免 Boost 的方法。 有人知道方法吗?
以下工作,但我不确定它是否是你想要的:
#include <type_traits>
#include <string_view>
template<const char *const t_name>
class TestString {
public:
static constexpr bool TestStringCondition(const char *name) noexcept {
return std::string_view(name).find('a') != std::string_view::npos; // random condition
}
constexpr TestString() noexcept {
static_assert(TestStringCondition(t_name));
}
};
constexpr char okay[] = "okay"; // array, so it is a static object with linkage
int main() {
static const TestString<okay> testString{};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.