簡體   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