即将推出的C ++ 0x标准中是否有关于模板和/或函数中命名参数的更新?例如,我希望能够写下以下内容:
先前已定义:
template<class T = int,class Policy_1, class Policy_2>
class X
{
};
然后在主要:
X<Policy_2: NoReturn> x;
与功能相同;具有:
void f(int arg_1 = 0, int arg_2 = 1, int arg_3 = 2)
{
}
然后在主要:
f(arg_3: 55);
答案 0 :(得分:9)
对于函数,您可以使用命名参数Idiom (在C ++ 98和C ++ 0x中)。
请参阅C ++ FAQ项目10.20 What is the "Named Parameter Idiom"?。
对于模板参数,我认为你可以使用包装的思想,使用“类型载体”类型,通过它们的类型编码它们是哪个模板参数。它变得复杂。您可以查看Boost参数库中的想法,但实质上,对于模板参数,我认为不值得花时间(更不用说实际使用) - 它是学术性的。
干杯&amp;第h。,
答案 1 :(得分:8)
没有那种语法,虽然使用这种结构变得更容易,但创建它们却相当混乱。
请参阅Boost.Parameter
你最终得到了
typedef template_by_named< policy1<type1>, policy2<type2> > x;
和
f(param_b = 23, param_d = 42)
答案 2 :(得分:0)
不,这不会在C ++ 0x中起作用。
答案 3 :(得分:0)
This article描述了一种可用于模拟命名模板参数的技术。
语法示例:
enum class bars { bar1, bar2, bar3 };
// Omitted definitions of get_value, is_present, get_type, a, b, c and d.
template <typename... Args>
struct foo {
static constexpr auto A = get_value<a<1>, Args...>::value;
static constexpr auto B = get_value<b<bars::bar2>, Args...>::value;
static constexpr auto C = is_present<c, Args...>::value;
using D = typename get_type<d<char>, Args...>::value;
};
// Client code
foo<d<float>, a<42>> f;
// f::A equals to 42;
// f::B equals to defaulted bars::bar2;
// f::C equals to false, because c is not present among temlate arguments;
// f::D equals to float
答案 4 :(得分:-5)
我们其余的人只是使用了论证结构并克服了它。没有。