对成员类型的成员方法使用 std::result_of<>

Using std::result_of<> for member method of member type

本文关键字:result lt gt of std 类型 成员类 成员 成员方法      更新时间:2023-10-16

我正在使用一个没有指定其键入为公共成员的keytype的hashmap类型,仅是valueType。检索键盘的一种方法是将std::result_ofHashMap<>::Entry::GetKey()方法一起使用。我无法在模板中工作。

template <typename K, typename V>
class Map {
public:
  using ValueType = V;
  class Entry {
  public:
    K GetKey();
  };
};

这很好:

using M = Map<int, float>;
using T = std::result_of<decltype(&M::Entry::GetKey)(M::Entry)>::type;
static_assert(std::is_same<T, int>::value, "T is not int");

但是,我该如何从 M是模板类型参数的模板中进行?我试图使用上述并插入typename关键字而没有成功。

template <typename M>
struct GetKeyType {
  using T = std::result_of<decltype(&(typename M::Entry)::GetKey)(typename M::Entry)>::type;    
};
using T = GetKeyType<Map<int, float>>::T;
static_assert(std::is_same<T, int>::value, "T is not R");

&M::Entry::GetKey是整体,您不应通过typename分开它们。

以下代码将起作用:

template <typename M>
struct GetKeyType {
  using T = typename std::result_of<decltype(&M::Entry::GetKey)(typename M::Entry)>::type;
};