簡體   English   中英

C++ 中函數模板的返回類型作為第二個模板參數

[英]return type of a function template in C++ as second template parameter

如何實現下面的模板?

std::result_of不是這樣工作的。

我希望能夠通過其他外部方式更改std::vector

我想在我的模板中保留FV作為第一個

最好在 C++17 中

謝謝

template <typename F, typename V=vector<result_of<F>>, typename T, typename Ts ...>
auto call (F f, const T & t, const Ts & ... ts) {
  V v;  //  v is a container for values returned from f
  f(....);  // f is a funtion
  ....
  return v;
}

據我了解,您希望根據函數的返回類型提供一個默認模板參數,而無需函數參數類型。 我不知道有什么好方法可以做到這一點,但是這個 hack 似乎可以解決您的問題

template <typename F, typename V=bool, typename T, typename... Ts>
auto call(F f, const T& t, const Ts&... ts) {
      using Container = typename std::conditional<std::is_same<bool,
      V>::value,
      std::vector<decltype(f(/*... whatever the args are*/))>,
      V>::type;

      Container c;
     // do stuff...
     return c;
}

不確定你想要什么......

但我想是這樣的

template <template <typename...> class C = std::vector,
          typename F, typename T, typename ... Ts>
auto call (F f, const T & t, const Ts & ... ts)
 {
   C<decltype(f(t))> v;

   (v.emplace_back(t), ..., v.emplace_back(ts));

   return v;
}

其中容器類型是第一個模板參數,默認為std::vector

所以你可以打電話

auto cv = call<std::vector>(foo, '0', '1', '2', '3');

或者也

auto cv = call(foo, '0', '1', '2', '3');

但我看到的真正問題是:如何在容器中插入元素?

我使用過emplace_back() ,在考慮std::vector 但是如果你想通過(例如) std::set ,你不會找到emplace_back()而是emplace_back() emplace() 那么您是否還想將插入方法作為模板參數傳遞?

無論如何,以下是一個完整的工作示例

#include <vector>
#include <iostream>

template <template <typename...> class C = std::vector,
          typename F, typename T, typename ... Ts>
auto call (F f, const T & t, const Ts & ... ts)
 {
   C<decltype(f(t))> v;

   (v.emplace_back(t), ..., v.emplace_back(ts));

   return v;
}

int foo (char ch)
 { return ch; }

int main()
 {
   auto cv = call(foo, '0', '1', '2', '3');

   for ( auto const & i : cv )
      std::cout << i << ' ';

   std::cout << std::endl;
 }

最后我得到了這個

template <typename Rt = void, typename F, typename T, typename... Ts>
      auto mapf(F f, const T & t, const Ts & ... ts) {
          auto m = minsize(t, ts...);
          using Vt = decltype(std::forward<F>(f)(*begin(t), *begin(ts)...));
          using V = typename std::conditional<is_same<Rt,void>::value, vector<Vt>, Rt>::type;
          V r;                                                                                                                                                                                                                                                               
          r.resize(m);
          for(auto i = 0u; i < m; i++) {
              auto tuples =  make_tuple(*next(begin(t),i), *next(begin(ts),i)...);
             auto v = apply<tuple<typename T::value_type, typename Ts::value_type ...>>(tuples, forward<F>(f));
              *next(begin(r),i) = move(v);
          }    
          return r;
      }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM