命名?模板,函数中的参数

时间:2010-11-17 21:26:31

标签: c++ c++11

即将推出的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);

5 个答案:

答案 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)

我们其余的人只是使用了论证结构并克服了它。没有。