我有一个当前包含两个模板参数的函数。一个预计是智能指针,另一个预计是对象类型。例如,SmartPtr<MyObject>
作为第一个模板参数,MyObject
作为第二个模板参数。
template <typename T, typename TObject>
我想知道是否可以从第一个参数MyObject
自动确定第二个参数SmartPtr<MyObject>
,以便我的模板函数编写如下:
template <typename T>
原始模板函数中的类型TObject
是从T
自动确定的,它应该是一个智能指针。
根据要求,这是函数声明及其用法:
template <typename T, typename TObject>
T* CreateOrModifyDoc(T* doc, MyHashTable& table)
{
T* ptr = NULL;
if (!table.FindElement(doc->id, ptr))
{
table.AddElement(doc->id, new TObject());
table.FindElement(doc->id, ptr);
}
return ptr;
}
答案 0 :(得分:11)
如果您知道第一个模板参数将是智能指针类型,为什么不使用一个参数声明您的函数并使用它:
template<typename T>
void WhatIsIt(SmartPtr<T> ptr)
{
printf("It is a: %s" typeid(T).name());
}
答案 1 :(得分:3)
如果可以作为第一个模板参数的类可以通过通用名称提供方便的typedef,则可以执行以下操作:
template <typename T>
class SmartPtr
{
public:
typedef T element_type;
// ...
};
template <typename PtrType, typename ObjType=PtrType::element_type>
void your_function_here(const PtrType& ptr)
{
// ...
}
答案 2 :(得分:2)
你写过SmartPtr吗?如果是这样,请将其添加到其中
typedef T element_type;
答案 3 :(得分:1)
我知道的所有智能指针都支持成员::element_type
。例如boost的shared_ptr:http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/shared_ptr.htm#element_type,但std
智能指针也支持此约定。
template <typename T> class SharedPtr {
public:
typedef T element_type;
// ...
};