如何创建一个std :: function相似的包装器?

时间:2016-01-21 09:54:18

标签: c++

试图这样:

user

但失败了:

template <class R, class... Ts>
class MyFunction
{
public:
    using func_type = R(*)(Ts...);

    MyFunction(func_type f)
      : m_func(f) 
    {
    }

    R operator()(Ts ... args) 
    {
        return m_func(args...);
    }

private:
    func_type m_func;
};

int Testfn(int a)
{
    std::cout << "value is " << a;
    return 42;
}

void Testing()
{
    MyFunction<int(int)> func(Testfn);
    std::cout << "Ret is " << func(1) << std::endl;
}

编译器是MSVC2013。

1 个答案:

答案 0 :(得分:4)

应该是这样的:

template <typename T>
class MyFunction;

template<typename R, class... Ts>
class MyFunction<R(Ts...)>
{
public:
    using func_type = R(*)(Ts...);

    MyFunction(func_type f)
      : m_func(f) 
    {
    }

    R operator()(Ts ... args) 
    {
        return m_func(args...);
    }

private:
    func_type m_func;
};

MyFunction应专门用于函数签名类型。 注意:std::function实际上更复杂。