c++ 如何在编译时检查是否有足够的`{}`占位符用于所有参数?

mbzjlibv  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(159)

std::format有一个(编译时和运行时)格式字符串验证,但有一件事没有包括在这个验证中,那就是是否有足够的{}占位符用于所有参数(过多的参数会被忽略)。
我假设这在某些罕见的情况下可能有用(例如,如果您生成格式字符串),但我不需要它,并且因为这个我有一些bug。
我能做些什么来检查这个编译时的问题吗?可能是通过在我自己的函数中 Package std::format
范例:

#include <format>
#include <iostream>

int main()
{
    std::cout << std::format("{} {}", 1, 2, 3, 4, 5) << '\n'; // Prints `1 2`, no error!
}

字符串

注意:std::format编译时格式字符串验证。他们只是不检查这个特定的问题(过多的参数)。

eh57zj3b

eh57zj3b1#

你可以添加wrapper:

template <typename... Ts>
struct my_format_string
{
    consteval my_format_string(const char* s) :
        my_format_string(std::format_string<Ts...>(s))
    {}

    consteval my_format_string(const std::format_string<Ts...> s) : s(s)
    {
        // Use proper validation check

        // placeholder validation of the placeholders
        if (std::count(s.get().begin(), s.get().end(), '{') != sizeof...(Ts)) {
            throw 42;
        }
    }
    constexpr auto get() const { return s; }

    std::format_string<Ts...> s;
};

template <typename... Ts>
auto my_format(my_format_string<std::type_identity_t<Ts>...> format, Ts... args)
{
    return std::vformat(format.getS().get(), std::make_format_args(args...));
}

字符串
Demo

相关问题