gpt4 book ai didi

c++ - 枚举值的编译时列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:53 27 4
gpt4 key购买 nike

在现代 C++(GCC 5.1.0,所以我猜是 C++14)中,在编译时传递 enum 值列表的最快方法是什么,然后,在运行时检查其中有哪些值?

enum foobar { foo, bar, baz };

template<????>
void f() {
if( contains<????, foo>() )
std::cout << "foo!";
if( contains<????, bar>() )
std::cout << "bar!";
if( contains<????, baz>() )
std::cout << "baz!";
}

f<foo,bar>();

注意:这是为了单元测试,所以速度等主要是无关紧要的,主要目标是让不熟悉代码的人可以破译它。

最佳答案

这是一个建议

#include <initializer_list>// pulled in by a lot of stuff

enum class options { foo,bar,baz };
void test_func(options opt)
{

}
int main()
{
auto test_vector = { options::foo, options::bar };
for (auto option : test_vector)
{
test_func(option);
}
return 0;
}

检查提供的测试 vector 是否包含它们应该包含的内容稍微复杂一些:

#include <initializer_list>
#include <algorithm>
#include <stdexcept>

enum class options { foo, bar, baz, wuz };
void test_func(options)
{

}

template<typename AT, typename BT>
void assert_test_vectors(AT a, BT check_these_items)
{
for (auto item : check_these_items)
{
auto test = std::find(a.begin(), a.end(), item) != a.end();
if (!test)
{
return throw std::runtime_error("You suck");
}
}
}

template<typename T>
void run_tests(T tests)
{
const auto better_have_these = { options::foo, options::bar };
assert_test_vectors(tests, better_have_these);
for (auto test : tests)
{
test_func(test);
}
}

int main()
{
const auto test_vectors = { options::foo, options::wuz };
run_tests(test_vectors);
return 0;
}

关于c++ - 枚举值的编译时列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50694141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com