【发布时间】:2015-08-10 22:56:21
【问题描述】:
我有一个模板,它有一个函数指针作为它的第二个参数和一个函数指针所依赖的类型,因为它是第一个参数。
即
template <typename P, typename void(*fn)(P)>
auto function(P) -> otherType<P, fn>;
我想这样做,这样我就可以在模板列表中指定函数指针,而不必指定依赖类型,因为该类型应该以某种方式能够从函数指针中推断出来我指定(或可能甚至是参数列表,但我认为它可能太远了)。
我的第一个想法是推迟转换为模板参数值,方法是传递一个模板类型名,然后通过模板元编程向导在事后转换为一个值。
即
template <typename F, typename P>
auto function(P) -> [[ something here to get otherType<P, fn> if F was a function pointer ]]
但是,我不确定如何做到这一点。有什么想法吗?
编辑
我在这里尝试完成的是创建一个将生成类对象的辅助函数。所以,鉴于 StenSoft 所说的,这就是我想出的。不幸的是,它不适用于 main() 函数内部的失败,由于演绎失败,它无法匹配正确的函数:
#include <iostream>
#include <functional>
template<typename T, typename F>
struct wrapper_fntor
{
T m_t;
F m_f;
wrapper_fntor(T t, F f) : m_t(t), m_f(f) {}
void invoke() { m_f(m_t); }
};
template<typename T, void(*fn)(T)>
struct wrapper_fn
{
T m_t;
wrapper_fn(T t) : m_t(t) {}
void invoke() { fn(m_t); }
};
template <typename T>
struct Wrapper;
template <typename Ret, typename P>
struct Wrapper<Ret(P)>
{
template <Ret(*fn)(P)>
static Ret function(P p)
{
return fn(std::forward<P>(p));
}
template <Ret(*fn)(P)>
static P get_param_type(P);
typedef decltype(get_param_type<Ret(P)>()) param_t;
};
template<typename F>
wrapper_fn<typename Wrapper<F>::param_t, &Wrapper<F>::function> make_wrapper(typename Wrapper<F>::param_t param)
{
return wrapper_fn<typename Wrapper<F>::param_t, &Wrapper<F>::function>(param);
}
template<typename F>
wrapper_fntor<typename Wrapper<F>::param_t, F> make_wrapper(typename Wrapper<F>::param_t param, F fntor)
{
return wrapper_fntor<typename Wrapper<F>::param_t, F>(param, fntor);
}
void function(int value)
{
std::cout << "function called " << value << std::endl;
}
int main()
{
auto x = make_wrapper<function>(3);
x.invoke();
}
【问题讨论】:
-
@PiotrSkotnicki:谢谢。不幸的是,这就是我一直在寻找的答案。 IE。到目前为止还不能完成。 :-(
-
有几个问题:
get_param_t需要函数指针,但您在param_t的定义中提供了函数类型。而不是decltype(get_param_type<Ret(P)>()),只需使用P。Wrapper需要函数类型,但您为其提供函数指针。使用Wrapper<decltype(F)>。Wrapper<F>::function是一个模板,你需要指定它的参数:Wrapper<decltype(F)>::function<F>。最重要的是,不可能以您想要的方式声明make_wrapper。这就是我使用宏而不是模板方法的原因。