使用 std::result_of<> 作为成员类型的成员方法
Using std::result_of<> for member method of member type
我使用的 HashMap 类型没有将其 KeyType 指定为 public 成员,仅指定了 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");
&M::Entry::GetKey
是一个整体,不能用typename
隔开。
以下代码将起作用:
template <typename M>
struct GetKeyType {
using T = typename std::result_of<decltype(&M::Entry::GetKey)(typename M::Entry)>::type;
};
我使用的 HashMap 类型没有将其 KeyType 指定为 public 成员,仅指定了 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");
&M::Entry::GetKey
是一个整体,不能用typename
隔开。
以下代码将起作用:
template <typename M>
struct GetKeyType {
using T = typename std::result_of<decltype(&M::Entry::GetKey)(typename M::Entry)>::type;
};