我目前正在清理一個充滿功能模板的API,並且強烈要求編寫下面的代碼。需要默認參數值的模板函數的首選設計是什麼?
template <typename T, typename U, typename V>
void doWork(const T& arg1, const U& arg2, V* optionalArg = 0);
當我調用這個模板時,我想這樣做如下。
std::string text("hello");
doWork(100, 20.0, &text);
doWork('a', text); // oops!
doWork<char, std::string, void>('a', text); // to verbose!
不幸的是,由於編譯器無法推斷出可選參數的類型,所以第二次調用不能編譯。這是不幸的,因爲我真的不在乎參數類型是什麼,而是它的值是NULL。另外,我想避免第三次調用的路由,因爲它妨礙了可讀性。
這使我試圖使模板參數V
有一個默認類型,這也不起作用,因爲您不能將默認類型應用於函數模板參數(至少使用VC++ 9.0)。
template <typename T, typename U, typename V = void> // oops!
void doWork(const T& arg1, const U& arg2, V* optionalArg = 0);
我唯一的選擇是引入近朱者赤模板實參V
的doWork
過載。
template <typename T, typename U>
void doWork(const T& arg1, const U& arg2)
{
doWork(arg1, arg2, 0);
}
template <typename T, typename U, typename V>
void doWork(const T& arg1, const U& arg2, V* optionalArg);
這是解決此問題的最佳方法嗎?我看到的唯一缺點是,如果函數模板包含許多具有合適默認值的參數,我可能會引入許多簡單的轉發函數。
是的,你是對的。應在轉發功能中指定'0'的類型。 (FR) – 2009-10-12 17:38:58