【发布时间】:2014-05-14 08:32:14
【问题描述】:
假设我有以下函数,它接受一个函数作为参数。
template <typename F>
void test_func(F f)
{
// typedef typename function_traits<F>::return_type T;
typedef int T;
std::mt19937 rng(std::time(0));
std::uniform_int_distribution<T> uint_dist10(0, std::numeric_limits<T>::max());
f(uint_dist10(rng), uint_dist10(rng)); // Problem!
}
用法如下:
int foo(int, int) { return 0; }
int bar(int, int, int, int) { return 0; }
int main()
{
test_func(foo);
// test_func(bar);
}
就像foo 和bar 一样,我有几个函数返回T,并接受一些T 类型的参数。我希望test_func 生成对我的 RNG 的尽可能多的调用,因为函数 f 需要参数。换句话说,我们可以假设T 始终是整数类型,并且每个参数都是相同的,即对 RNG 的函数调用。
使用function_traits(例如the ones in Boost),我可以获取F的返回类型,这有点帮助。大致来说,我的问题是
如何生成所需数量的函数调用,使其与函数 F 的数量相匹配?
在 C++11 之前,我会研究 Boost.Preprocessor,或者可能依赖于模板专业化。现在有更好的方法吗?
【问题讨论】:
-
好吧,数量确实是个问题。如果您将 bar 传递给它,其他参数应该是什么?除了您能够选择正确的值之外,其他人应该如何选择?编译器肯定不能。一种解决方法是将调用包装在 lambda 或其他知道剩余参数的函数中。
-
您可以使用可变参数模板并转发参数包。
-
@Samuel 为简单起见,我们可以假设每个参数都是对(比如说)RNG 的调用,就像在示例中一样。此外,假设
T始终是整数类型。 -
@πάνταῥεῖ 这将如何运作? test_func 无法打包参数,因为它们被明确定义为 (int, int) 转发它们不会为具有任意参数的函数产生正确数量的参数。
-
就像我通常做的那样,我只想提一下,C++ 中的可调用对象不一定具有明确定义的数量。