我正在寻找一种将函数和类方法绑定到特定原型的方法。
让我们说我想用这个原型
绑定函数和类方法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
有什么想法吗?
答案 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>{}();
}