[英]c++ template function overload for pointer type
我使用std::type_index
对象作为状态类的唯一标识符(基本上,工厂函数中的键可生成引用类型的新对象)。 一个类的ID,该类的对象以及指向该类对象的指针都应相同。 因此,我尝试做:
using stateid_t = std::type_index;
template<class T> inline stateid_t GetStateID() { return typeid(T); }
template<class T> inline stateid_t GetStateID(const T&) { return typeid(T); }
template<class T> inline stateid_t GetStateID(const T*) { return typeid(T); }
但是,第三个版本永远不会用GetStateID(this);
类的东西来调用GetStateID(this);
,始终是第二个版本,其类型T被推导为“ T的指针”。
我认为我应该能够使用std::enable_if
做到这一点,但我似乎无法提出任何可行的方法。
我想要的主要是一组可以满足的功能
struct A{};
A a;
const A b;
//fixed asserts based on comments
assert(GetStateID<A>() == GetStateID(a));
assert(GetStateID(a) == GetStateID(&a));
assert(GetStateID(a) == GetStateID(b));
//added some new constraints
struct X : public A{};
X x;
assert(GetStateID<A>() != GetStateID<X>());
assert(GetStateID(a) != GetStateID(x));
奖励点解释了为什么未选择指针过载。
大概是从非const
成员函数调用这些函数。 如果是这种情况,那么stateid_t GetStateID(const T*)
需要隐式转换(从U*
到const U*
,其中U
是类的类型),而stateid_t GetStateID(const T&)
不需要( U
将是U*
)。 在const
成员函数的上下文中, this
指针已经是const U *
,不需要隐式转换,应调用stateid_t GetStateID(const T*)
。
删除这些const
应该可以解决问题。 U*
和const U*
stateid_t GetStateID(T*)
stateid_t GetStateID(T&)
更喜欢stateid_t GetStateID(T*)
stateid_t GetStateID(T&)
。
但是,您似乎正在尝试实施已解决问题的解决方案。 表达式typeid(std::remove_pointer_t<T>);
应该已经产生了您想要的。 就您的代码而言,以下内容将为您工作:
using stateid_t = std::type_index;
template<class T> inline stateid_t GetStateID() {
return typeid(std::remove_pointer_t<T>);
}
编辑:要完成您的界面要求,您可以添加一个推导T
的功能模板:
template<class T> inline stateid_t GetStateID(T&&) {
return GetStateID<T>();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.