我有一個模板的問題,不知道有沒有可能的方式來實現我想做的事。這是我的問題。模板類型名稱問題
template <typename T>
class A
{
public:
typedef T* pointer;
typedef const pointer const_pointer;
A()
{}
template <typename D>
A(const D& d)
{
// how can I store the D type
// so I can refer it later on
// outside of this function
}
};
確定這裏是什麼,我想做一個更完整的代碼(它可能不是編譯)
class C
{
public:
virtual ~C(){}
virtual void* get_d() = 0;
private:
};
template <typename T, typename D>
class Cimpl : public C
{
public:
Cimpl()
:t()
,d()
{}
Cimpl(const T& t, const D& d)
:t(t)
,(d)
{}
void* get_d()
{
return &reinterpret_cast<D&>(d);
}
private:
T t;
D d;
};
class B
{
public:
B()
:p(0)
{}
template <typename T, typename D>
B(const T& t, const D& d)
:p(0)
{
try
{
p = new Cimpl<T, D>(t, d);
}
catch(...)
{
d(p);
}
}
void* get_d()
{
return (p != 0) ? p->get_d() : 0;
}
~B()
{
delete p;
}
private:
C* p;
};
template <typename T>
class A
{
struct example_d
{
};
public:
typedef T* pointer;
typedef const pointer const_pointer;
A()
{}
template <typename D>
A(const T& t)
:b(t, example_d())
{
}
template <typename D>
A(const T& t, const D& d)
:b(t, d)
{
// how can I store the D type
// so I can refer it later on
// outside of this function
}
// not type safe...as user can cast to any type
// if I can store the type user pass in previous
// then I can use it back
template <typename T>
T* get_d()
{
reinterpret_cast<T*>(b.get_d());
}
private:
B b;
};
所以我可以使用類像
1)A<int> a(1);// with example_d as D
2)A<int> b(1, another_d()) // with another_d
我可以將模板更改爲2個參數,並將第2個類型的默認參數設置爲example_d。所以我可以達到1)但不是2)。正如我將要編寫這樣
A<int, another_d> b(1, another_d());
有點太長型...
不能存儲類型本身,但也有變通方法。你想用D做什麼? – 2010-03-23 15:29:24
參數'T'有什麼意義?這與問題有什麼關係? – Seb 2010-03-23 15:30:11
我沒有澄清我實際上想做什麼。我想要一個類只需要一個模板參數。然後另一個模板類型提供參數構造函數。我可以在課程的其他部分使用D型,而不僅僅是類型D的通過 – stephenteh 2010-03-23 15:40:15