gpt4 book ai didi

c++ - 通过剥离变量宏/模板/函数对来测试成员函数?

转载 作者:太空狗 更新时间:2023-10-29 21:34:20 26 4
gpt4 key购买 nike

(我正在使用 catch 进行单元测试,不幸的是,它还没有调用生成器来做这种事情。)

c++17 , 有没有办法减少这个:

assert(""  == String{""  }.removeLeading(' '));
assert("a" == String{" a").removeLeading(' '));
assert("a" == String("a" }.removeLeading(' '));
assert("a" == String{"a "}.removeLeading(' '));

使用这样的宏、模板或函数:

#define MACRO(className, method, arg, ...) \
for(auto [x, y] : { __VA_ARGS }) { \
assert(x == className{y}.method(arg)); \
}

所以它像这样更短:

MACRO(String, removeLeading, ' ',
{ "", "" }, {"a", " a"}, {"a", "a"}, {"a", "a "})

// or

MACRO(String, removeLeading, ' ',
"", "", "a", " a", "a", "a", "a", "a ")

假设所有...参数“auto”为相同类型。

基本没有数量限制...参数。 (也许可以达到 100?)

使用第一个MACRO()给出:unable to deduce 'std::initializer_list<auto>&&' from... (它也不理解在 , 标记上如此严格分开的语义,但只要它正确组合在一起,就没关系。)

使用第二个 MACRO()给出:cannot decompose non-array non-class type 'const char*'


尝试模板:

template<typename T>
void TEMP(T a, T b) {
assert(a == String{ b }.removeLeading(' '));
}

template<typename T, typename... Args>
void TEMP(T a, T b, Args... args) {
TEMP(a, b);
TEMP(args...);
}

TEMP("", "", "a", " ", "a", "a", "a", "a ");

这至少有效,但我不想要 className , method , 和 arg硬编码为 "String" , "removeLeading" , 和 " " .


我想知道是否有一种方法可以使用我没有做过太多工作的所有新类型特征/“元”模板(不确定还有什么可以调用它们)来实现这一目标。 (我查看了过去一两年中可用的一些库,它们对我来说几乎像是一种不同的语言...)

最佳答案

这几乎可以工作:

for (auto [x,y] : {{"a", "b"}, {"c", "d"}, {"e", "f"}}) {
foo(x, y);
}

唯一的问题是内部的 braced-init-list 不能自己推导出来。所以我们只需要给编译器一点插入。

using P = std::pair<char const*, char const*>;
for (auto [x,y] : {P{"a", "b"}, {"c", "d"}, {"e", "f"}}) {
foo(x, y);
}

那行得通。只需识别第一个就足够了。或者,对于您的具体示例:

for (auto [exp, arg] : {P{"", ""}, {"a", " a"}, {"a", "a"}, {"a", "a "}}) {
assert(exp == String(arg).removeLeading(' '));
}

如果你真的想为此写一个宏,那么此时应该清楚地知道如何去做。

关于c++ - 通过剥离变量宏/模板/函数对来测试成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46930431/

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