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