的Modern C++ Design給了下面的例子:使用模板模板類參數作爲參數
template <class T> struct EnsureNotNull
{
static void Check(T*& ptr)
{
if (!ptr) ptr = GetDefaultValue();
}
};
template
<
class T,
template <class> class CheckingPolicy = EnsureNotNull,
template <class> class ThreadingModel
>
class SmartPtr
: public CheckingPolicy<T>
, public ThreadingModel<SmartPtr>
{
...
T* operator->()
{
typename ThreadingModel<SmartPtr>::Lock guard(*this);
CheckingPolicy<T>::Check(pointee_);
return pointee_;
}
private:
T* pointee_;
};
我想不出怎樣的ThreadingModel模板會以一種方式構成,即它可以接受的SmartPtr爲參數,在我心中一些瘋狂的遞歸將會發生。這怎麼可能?
編輯:
我試過Potatoswatter(不好意思笑)評論:
template <class SmartPtr> struct SingleThreadingModel
{
class Lock
{
public:
Lock(SmartPtr&)
{
}
};
};
但它did'nt工作。
這裏是GCC是給我的錯誤:
main.cpp:28:35: error: type/value mismatch at argument 1 in template parameter list for ‘template<class> class ThreadingModel’
main.cpp:28:35: error: expected a type, got ‘SmartPtr’
啊,是的。模板模板參數。有史以來最令人困惑的事情之一。 – 2010-08-12 21:59:52
你的新代碼看起來很好。你得到什麼錯誤,在哪裏?另外,一個Tomatoswatter聽起來會讓它變得一團糟,我試圖避免這樣做。 – Potatoswatter 2010-08-13 01:09:04