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

时间:2018-04-27 18:20:39

标签: c++ templates typename result-of

我正在使用HashMap类型,该类型未将其KeyType指定为公共成员,仅指定ValueType。检索KeyType的方法是使用std::result_of方法HashMap<>::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");

1 个答案:

答案 0 :(得分:4)

&M::Entry::GetKey是一个整体,你不应该用typename分隔它们。

以下代码可以使用:

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