Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使函数模板成为测试的参数?_C++_Templates - Fatal编程技术网

C++ 如何使函数模板成为测试的参数?

C++ 如何使函数模板成为测试的参数?,c++,templates,C++,Templates,我想对类模板的等效模板成员函数进行单元测试。(作为背景,我想为库“经典”函数表示法的用户提供.bar()和带有|、&等的默认表示法,但我不想复制完整的测试代码。) #包括 样板 结构foo { 样板 自动栏(U&&U)&&{ //不管这里发生了什么。 返回foo(); } 样板 自动操作员|(U&&U)&&{ 返回杆(标准:向前(u)); } 样板 自动条形图(U和U)常数和{ //不管这里发生了什么。 返回foo(); } 样板 自动运算符|(U&&U)const&{ 返回杆(标准:向前(u)

我想对类模板的等效模板成员函数进行单元测试。(作为背景,我想为库“经典”函数表示法的用户提供.bar()和带有|、&等的默认表示法,但我不想复制完整的测试代码。)

#包括
样板
结构foo
{
样板
自动栏(U&&U)&&{
//不管这里发生了什么。
返回foo();
}
样板
自动操作员|(U&&U)&&{
返回杆(标准:向前(u));
}
样板
自动条形图(U和U)常数和{
//不管这里发生了什么。
返回foo();
}
样板
自动运算符|(U&&U)const&{
返回杆(标准:向前(u));
}
};
int main(){
使用void_t=void();
使用op_t=foo(foo::*)(void_t)&;
op_t ops[]={static_cast(&foo::bar),
静态_cast(&foo::operator |)};
用于(常数自动和运算:运算){
自动sut=(foo{}.*op)([](){});
//测试sut的行为
}
}
例如,clang报告我“重载函数'bar'的地址不能静态转换为'op't'类型”

还是我走错了路,这是不可能的?
(我尝试了Clang6和GCC7)

我可以通过将
op\t
更改为

using op_t = foo<void>(foo<void>::*)(void_t &&) &&;
//                                          ^^
auto sut = (foo<void>{}.*op)(*[](){});
//                           ^
using void_t = void (*)();
//                  ^^^
[](){}
可以转换为函数指针,但是
*op
引用函数,因此我们必须取消对指针的引用)

或者,您也可以将
void\u t
更改为,而不是更改
sut

using op_t = foo<void>(foo<void>::*)(void_t &&) &&;
//                                          ^^
auto sut = (foo<void>{}.*op)(*[](){});
//                           ^
using void_t = void (*)();
//                  ^^^

现在
void\u t
已经是一个函数指针,因此您不必取消引用。

如果
bar
不是静态成员,那么
&foo::bar
首先应该是什么呢?@HenningKoehler是一个指向成员的指针。但是如果存在一个非静态成员,您首先需要有一个实例…我可以通过使用op\u t=foo(foo::*)(void\u t&&)将
op\u t
更改为
,来编译此代码
sut
auto-sut=(foo{}.*op)(*[](){})。或者,除了更改
sut
,您还可以使用void\u t=void(*)将
void\u t
更改为
.Off-Topic:从C++17开始,
std::void\t
是标准的一部分(具有完全不同的含义)。为避免冲突,我建议为您的
void\u t