【问题标题】:Using variardic template static function as template parameter使用可变模板静态函数作为模板参数
【发布时间】: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&lt;...&gt;(nullptr, 2.0) 不会简单地编译,因为它没有重载。
  • 你可以尝试auto func而不是WrappedFuncType&lt;R, Ts...&gt; func,然后推导出RTs。这是一个 C++17 特性。参数包(您的Ts)之后的非类型模板参数(您的func)将永远不会匹配。
  • @Treviño 当您的代码中有多个问题时,要知道如何帮助您要困难得多,而您只关心其中的一些问题。许多人提出问题时假设他们的问题实际上是由代码中的其他内容引起的。像这样脱离上下文,我们无法真正分辨出区别。您应该编辑您的问题,以便代码中的唯一问题是您面临的挑战。

标签: c++ templates c++17 variadic-templates


【解决方案1】:
template<auto func, class...Ts>
inline bool wrap_func(ObjectType* obj, Ts...) {}
ObjectType* foo_func(ObjectType*, double bar);

wrap_func<foo_func>(nullptr, 2.0);

或者

template <typename R = void, typename... Ts>
using WrappedFuncType = R(*)(ObjectType*, Ts...);
template<auto x>
using constant_t=std::integral_constant<std::decay_t<decltype(x)>,x>;
template<auto x>
constexpr constant_t<x> constant={};

template<class R, class...Ts>
[[nodiscard]] auto wrap_func(Ts...){
  return [&]<R(*func)(Ts...)>(constant_t<func>){
    // code
  };
}

wrap_func<int, double>(nullptr, 2.0)(constant<foo_func>);

【讨论】:

  • 会,尝试,但我不想将参数传递给wrap_func,它应该有一个稳定的签名并且总是(ObjectType* obj),那么包装函数的具体参数将是从obj中提取。
  • @trev wrap func 做什么?这是你的问题。基本上,忽略所有参数都会满足您的所有要求。你可以说得更详细点吗?我匹配了第二个示例的 wrap func 使用模式以做得更好我必须读懂你的想法。
  • 该函数应该调用带有更多参数的包装函数,但这不应该是使用元组的问题。
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多