【发布时间】:2021-04-15 02:17:35
【问题描述】:
我想在 C++17 中使用可变参数模板重写当前使用 C 宏定义的一些函数,但不幸的是,编译器似乎没有正确处理如何确定我的模板参数的类型。
其实在使用的时候
template <typename R = void, typename... Ts>
using WrappedFuncType = R(*)(ObjectType*, Ts...);
template<class R, typename ...Ts, WrappedFuncType<R, Ts...> func>
inline bool wrap_func(ObjectType* obj) {}
ObjectType* foo_func(ObjectType*, double bar);
// Doesn't work when using
wrap_func<int, double, foo_func>(nullptr);
由于某种原因,这是因为虽然foo_func 不被视为一种类型,但它也没有被用来确定它是函数模板。
使用编号参数当然可以,但需要多次覆盖...
否则另一种解决方案,甚至不确定是否可能,将有类似的东西:
template<class R, WrappedFuncType<R, template<typename ...Ts>...> func>
inline bool wrap_func(ObjectType* obj) {}
wrap_func<foo_func>(nullptr, 2.0);
因此,从函数签名中找出 Ts,但不确定这是否需要其他东西。
【问题讨论】:
-
@JerryJeremiah 是的,抱歉固定为松元瑶的意思
-
你不只是想做:
auto wrapped = std::bind(foo_func, nullptr, 2.0);吗? -
但更多关于您的代码,
wrap_func()是一个接受单个参数的函数,因此调用wrap_func<...>(nullptr, 2.0)不会简单地编译,因为它没有重载。 -
你可以尝试
auto func而不是WrappedFuncType<R, Ts...> func,然后推导出R和Ts。这是一个 C++17 特性。参数包(您的Ts)之后的非类型模板参数(您的func)将永远不会匹配。 -
@Treviño 当您的代码中有多个问题时,要知道如何帮助您要困难得多,而您只关心其中的一些问题。许多人提出问题时假设他们的问题实际上是由代码中的其他内容引起的。像这样脱离上下文,我们无法真正分辨出区别。您应该编辑您的问题,以便代码中的唯一问题是您面临的挑战。
标签: c++ templates c++17 variadic-templates