繁体   English   中英

指针类型的C ++模板函数重载

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM