我正在研究一个小型快速测试类,它将需要一个函数/仿函数来执行,以及函数/仿函数生成要执行的函数的输入。
例如,如果第一个函数是sqrt(x)
,第二个函数有状态并且正在计数,我希望类执行
sqrt(0.0);
sqrt(1.0);
...
对于一些迭代次数。
我可以相对容易地做到这一点(2 std::function
s 或模板),但是如果第一个函数需要多个参数,如何实现呢?我只能想到强制一个函数 take tuple
,并强制另一个函数 return tuple
,但这看起来很难看,并且强制接口在测试函数上。
编辑:我现在拥有的:
template <typename Func, typename ArgGen>
class Magic
{
std::function<double (time_t)> time_to_frequency;
std::set<decltype(Func()(ArgGen()()))> results_ok;
std::set<decltype(Func()(ArgGen()()))> results_fail;
ArgGen ag;
Func f;
public:
Magic(std::set<decltype(Func()(ArgGen()()))> results_ok, std::set<decltype(Func()(ArgGen()()))> results_fail, std::function<double (const time_t)> time_to_frequency) :
results_ok(results_ok), results_fail(results_fail), time_to_frequency(time_to_frequency)
{}
Magic()
{}
void run(const int n)
{
bool success=true;
for (int i=0; i< n; ++i)
{
auto rv = f(ag());
const bool result_ok = results_ok.count(rv);
if (result_ok)
{
printf(".");
}
else
{
success = false;
std::cout << i <<": value unexpected "<< std::endl;
}
}
std::cout << "run succeeded: " << std::boolalpha << success;
}
};