2012-01-31 83 views
1

有谁知道是否有任何明智的理由背后的决定,不能有可变参数模板的默认参数?不难想象:任何不能有默认可变参数模板的原因

template<class T, class... Policies = Default_Policy> 
class X 
{ 
}; 
+1

对不起,但这是严重不可读的。 – 2012-01-31 17:52:55

回答

1

当给定的参数个数可能不同时,使用默认参数似乎令人困惑。例如,当实例化模板时,你如何告诉编译器你想使用这个默认值?而编译器怎么会知道,如果你想

X<T, Default_Policy> 

X<T, Default_Policy, Default_Policy> 

没有显式使用名称 “Default_Policy” 等?

这是(至少在我看来)一个很好的理由,没有可变参数模板的默认参数。

2

参数包中包含零的东西是有效的。编写程序时应如何选择X<T>Policies = {}Policies = {Default_Policy}

(和你的语法不允许超过1项默认值,但是这只是语法)。

+0

“参数包”作为一个术语是否真的存在来描述这个?它通常被称为?谷歌搜索没有发现任何东西,我从来没有听说过。 – 2012-01-31 18:06:49

+2

@KonradRudolph:不知道它是否普遍,但它是正确的术语(n3290§14.5.3/ 3)。 – kennytm 2012-01-31 18:08:22

+0

#KennyTM它允许多个值:Policies = {P1,P2,P3} – smallB 2012-01-31 18:12:32

0

你并不需要一个新的语言功能,具有默认参数。专业化和模板别名就足够了。

template<template<typename...> class t, typename def, typename... a> 
struct give_default { 
    using type = t<a...>; 
}; 
template<template<typename...> class t, typename def> 
struct give_default<t, def> { 
    using type = t<def>; 
}; 

template<typename... t> 
using X_with_default = typename give_default<X, Default_Policy, t...>::type; 
+0

#Pubby,哦,我明白了。正如你已经证明的那样,我正在寻找一些疯狂且不可读的语法(Policy = {P1,P2,P3}),却没有意识到这种简单/更好/更自然的alrady存在。我感到非常愚蠢。 – smallB 2012-02-01 06:55:57