簡體   English   中英

自動推斷模板中的功能類型

[英]Auto deduce type of function in template

我有簡單的map實現和簡單的id (身份):

template <typename T>
T map(const T& x, std::function<decltype(x[0])(decltype(x[0]))> f) {
    T res(x.size());
    auto res_iter = begin(res);
    for (auto i(begin(x)); i < end(x); ++i) {
        *res_iter++ = f(*i);
    }
    return res;
}

template <typename T>
T id(T& x) {return x;}

當我打電話的時候

vector<int> a = {1,2,3,4,5,6,7,8,9};
map(a, id<const int>);

它工作,但我想要調用它沒有類型規范,像這樣:

map(a, id);

當我這樣做時,我得到錯誤:

error: cannot resolve overloaded function 'id' based on conversion to type 'std::function<const int&(const int&)>'
 map(a, id);
          ^

我如何解決它,當錯誤包含右邊界類型時,為什么編譯器不能從map上下文中推斷出id類型?

如果您處於符合C ++ 14的環境中,那么有一種非常簡潔的方法可以執行此操作。 不使用std :: function和模板化類,而是使用無約束轉發引用和通用lambda,如下所示:

#include <vector>

template <typename T,typename F>
T map(const T& x, F &&f) {
  T res(x.size());
  auto res_iter = begin(res);
  for (auto i(begin(x)); i < end(x); ++i) {
    *res_iter++ = f(*i);
  }
  return res;
}

auto id = [](auto x) { return x;};

int main()
{
  std::vector<int> v = {1, 2, 3, 4};
  auto v2 = map(v, id);
}

在C ++ 11中,您必須使用其operator()是模板化方法的仿函數替換泛型lambda,如下所示:

struct {
  template<typename T>
  T operator()(T x) const
  {
    return x;
  }
} id;

在C ++ 98語法中,您將無法使用轉發引用,因此您必須考慮復制和函子可變性問題。

這是因為id不是一個函數。 這是一個功能模板!

這意味着id是一個生成函數的模板,例如id<const int>但它實際上並不是一個函數。

在運行時,沒有id ,只有id創建的函數實例。

暫無
暫無

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

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