我创建了一个包含方法唯一标识的类型
template <typename Method, Method method>
struct identity {
};
所以我可以用独特的方式描述方法,即使它们具有相同的签名
struct Class {
void foo() {}
void bar() {}
};
typedef identity<decltype(&Class::foo), &Class::foo> foo_identity;
typedef identity<decltype(&Class::bar), &Class::bar> bar_identity;
std::cout << std::boolalpha << std::is_same<foo_identity, bar_identity>::value << std::end;
// prints "false"
由于实例化方法的身份过于冗长,因为两个名称都被使用了两次,因此可以缩短:
#define GEN_IDENTITY(NAME) identity<decltype(&NAME), &NAME>
GEN_IDENTITY(Class::foo)
但有没有办法在不使用宏的情况下推断它?或者也许还有其他方法可以获得一种独特地描述方法的类型?
答案 0 :(得分:4)
但是有没有办法在不使用宏的情况下推断它?
此刻,没有。我们建议在语言中添加一个构造,使非类型模板参数可以免除auto
(N4469)
但是现在,你可以用它来简化身份:
template<typename T, T t>
using identity = std::integral_constant<T, t>;