繁体   English   中英

如何在 class 内部传递的编译时检查字符串文字的条件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM