如何在编译时进行c++唯一性判断,如std::unordered_set?

tcomlyy6  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(135)

我想在编译时看到失败,比如static_assert,而不是运行时。

std::unordered_set<std::string> s;
#define insert(set, value)                                                     \
  if (!set.insert(value).second)                                               \
    assert(false);

void init() {
  insert(s, "dog");
  insert(s, "bird");
}
ulmd4ohb

ulmd4ohb1#

您可以:

template <typename T>
constexpr bool all_unique(std::span<T const> const items)
{
    for (int i = 0; i < items.size() - 1; ++i)
    {
        for (int j = i+1; j < items.size(); ++j)
            if (items[i] == items[j])
                return false;
    }

    return true;
}

int main()
{
    auto constexpr strings1 = std::array<std::string_view,4>{"ABC", "DEF", "GHI", "JKL"};
    static_assert(all_unique<std::string_view>(strings1), "array strings1 not unique");

    auto constexpr strings2 = std::array<std::string_view,5>{"ABC", "DEF", "GHI", "JKL","ABC"};
    static_assert(all_unique<std::string_view>(strings2), "array strings2 not unqiue"); //This line doesn't compile
}

请注意,这个函数有点昂贵-您可能希望将其标记为consteval而不是constexpr,并提供运行时版本,因为当您没有constexpr约束时,您可以进行一些改进。

相关问题