使用模板将类方法绑定到特定原型

时间:2015-04-23 07:41:25

标签: c++ templates

我正在寻找一种将函数和类方法绑定到特定原型的方法。

让我们说我想用这个原型

绑定函数和类方法
int (float)

到这个

void ()

这是我的代码

class Toto
{
public:
    int test(float f) { std::cout << "Toto::test " << f << std::endl; return 0; }
} toto;

int test(float f)
{
    std::cout << "test " << f << std::endl;
    return 0;
}

template <typename T, T t>
void func()
{
    t(4.0f);
}

template <typename T>
void func<int (T::*)(float), int (T::*method)(float)>()
{
    toto::*method(5.0f);
}

auto    main(int, char**) -> int
{
    func<int(*)(float), &test>();
    func<void (Toto::*)(float), &Toto::test>();

return EXIT_SUCCESS;

}

函数绑定工作正常,但方法似乎有一些我无法解决的语法问题。 g ++给了我这个错误:

src/main.cpp:28:6: error: parse error in template argument list
src/main.cpp:28:55: error: function template partial specialization ‘func<int (T::*)(float), <expression error> >’ is not allowed

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你不能部分专门化模板功能,但你可以用于class / struct:

namespace details
{
    template <typename T, T t>
    struct func_impl
    {
        void operator () () const { t(4.0f); }
    };

    template <typename T, int (T::*method)(float)>
    struct func_impl<int (T::*)(float), method>
    {
        void operator () () const { (toto.*method)(5.0f); }
    };

}   

template <typename T, T t>
void func()
{
    details::func_impl<T, t>{}();
}

Live demo