【问题标题】:C++ variadic template - limit number of argsC++ 可变参数模板 - 限制参数的数量
【发布时间】:2015-10-03 18:26:20
【问题描述】:

我有一个带有 set 函数的可变参数模板类,它填充内部数组:

template <size_t Dim>
class Vector
{
public:

    void SetValueTemplate(size_t index)
    {
        return;
    }

    template <typename X0, typename ...Xn>
    void SetValueTemplate(size_t index, X0 x0, Xn... xn)
    {
        val[index] = x0;
        SetCenterValueTemplate(index + 1, xn...);
    }

    template <typename ...X0>
    void SetValue(X0... t0)
    {
        SetValueTemplate(0, t0...);
    }

private:
    double val[Dim];
};

问题是,我可以这样称呼

Vector<3> v;
v.SetValue(0, 1, 2, 4, 5);

它可以正确编译。我可以限制它不编译吗?我可以使用static_assert,但是没有它可以吗?

【问题讨论】:

    标签: c++ templates c++11 variadic-templates


    【解决方案1】:

    是的,这是可能的,没有static_assert。例如,假设我们希望我们的 vector 类只能以参数的名称数量作为向量的维度进行赋值,您可以使用:

    template<std::size_t Dim>
    struct vector {
        template <typename X0, typename ...Xn>
        typename std::enable_if<sizeof...(Xn) + 1 == Dim, void>::type
        assign(X0 x0, Xn... xn) {}
    };
    

    这只是将std::enable_ifsizeof...结合使用来启用或禁用特定的分配功能。

    所以下面会编译:

    vector<3> x;
    x.assign(1, 2, 3);
    

    Live demo

    但这不会:

    vector<3> x;
    x.assign(1, 2, 3, 4);
    

    Live demo

    with(用于 Clang):

    main.cpp:14:7: error: no matching member function for call to 'assign'
        x.assign(1, 2, 3, 4);
        ~~^~~~~~
    

    这也不会:

    vector<3> x;
    x.assign(1, 2);
    

    Live demo

    带有类似的错误消息。

    【讨论】:

    • 这不会与 MSVC 2013 一起编译 - 'type' : is not a member of 'std::enable_if&lt;false,void&gt;'
    • @MartinPerry 你能准确地告诉我不能编译的代码吗?对于std::enable_if&lt;false, void&gt;,确实没有type 成员。这就是第二种情况应该出现的错误。
    • 如果我把它放在“现场演示”页面中,它会正确编译。好像是 MSVC2013 问题
    • 适用于 MSVC++14.0(2015)。
    • 之所以有效,是因为sizeof... 返回参数包中元素的数量。
    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2012-08-14
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多