我想在一个函数调用周围实现一个包装器,该包装器将执行以下操作:
template <template<class> class F>
void Wrapper(int n, F&& f)
{
switch (n)
{
case 1:
f<std::int8_t>();
break;
case 2:
f<std::int16_t>();
break;
default:
break;
}
}
template <class T>
void func()
{
// ... body of func()
}
这样我就可以在代码中进行以下调用:
Wrapper(1, func);
但是上述代码无法编译,因为
F&& f
构造无效-我需要指定参数的具体类型。但是,如果我使函数签名如下:template <template<class> class F, class T>
void Wrapper(int n, F<T>&& f)
那么我必须使用
f
的具体类型进行调用:Wrapper(1, func<std::int8_t>);
而且我将无法在
Wrapper
中进行切换。如何实现所需的行为?
最佳答案
如果您在编译时知道func
(即它不是某个函数指针),则可以使用以下解决方案:
template <template <class> typename F>
void Wrapper(int n) {
switch (n) {
case 1: F<std::int8_t>{}(); break;
case 2: F<std::int16_t>{}(); break;
default: break;
}
}
template <typename T>
void func() { std::cout << sizeof(T) << std::endl; }
template <typename T>
struct Func { void operator()() { func<T>(); } };
int main() {
Wrapper<Func>(1);
Wrapper<Func>(2);
}