我想在一个函数调用周围实现一个包装器,该包装器将执行以下操作:

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);
}

09-10 04:38
查看更多