将单个变量作为std :: initializer_list传递为函数参数

时间:2013-06-07 04:03:42

标签: c++ c++11 initializer-list

在更改现有代码以将std::initializer_list作为函数参数时,我注意到了一些奇怪的事情。这是原始代码:

function(type_t<t> parameter)

这就是我只将函数声明更改为:

function(std::initializer_list<type_t<t>> parameter)

然后我编译了我的代码,以获得由于修改而需要更改的错误列表。没有时我很惊讶。我也运行了我的程序,它的表现与以前一样。是std::initializer_list

的正确使用和预期行为

编辑: 这是实际的代码。功能定义:

bool Coaxial(const std::initializer_list<Vector2<t>> _l) const
{
    bool result_x = 1;
    bool result_y = 1;

    for(Vector2<t> other : _l)
    {
        if(other.x() != x())
            result_x = 0;
    }

    for(Vector2<t> other : _l)
    {
        if(other.x() != x())
            result_x = 0;
    }

    return (result_x || result_y);
};

它被称为:

static std::vector<AxisAligned_Rectangle2<t> > Construct(std::vector<Vector2<t> > _set)
{
    std::vector<AxisAligned_Rectangle2<t> > result;

    if(_set.size() == 2)
    {
        if(!_set[0].Coaxial(_set[1]))
        {
            if(std::abs(_set[0].x()) <= std::abs(_set[1].x()) && std::abs(_set[0].y()) <= std::abs(_set[1].y()))
            {
                result.push_back(AxisAligned_Rectangle2<t>(_set[0], _set[1].x() - _set[0].x(), _set[1].y() - _set[0].y()));
            }
            else
            {
                result.push_back(AxisAligned_Rectangle2<t>(_set[1], _set[0].x() - _set[1].x(), _set[0].y() - _set[1].y()));
            }
        }
    }
    else if(_set.size())
    {
        bool valid = 1;
        Vector2<t> origin(_set[0]);
        Vector2<t> opposite(_set[0]);

        for(int i=0; i<_set.size(); ++i)
        {
            if(std::abs(_set[i].x()) <= std::abs(origin.x()) && std::abs(_set[i].y()) <= std::abs(origin.y()))
                origin = _set[i];

            if(std::abs(_set[i].x()) >= std::abs(opposite.x()) && std::abs(_set[i].y()) >= std::abs(opposite.y()))
                opposite = _set[i];
        }

        for(int i=0; i<_set.size(); ++i)
        {
            if(!_set[i].Coaxial(origin) && !_set[i].Coaxial(opposite))
                valid = 0;
        }

        if(valid)
            result.push_back(AxisAligned_Rectangle2<t>(origin, opposite.x() - origin.x(), opposite.y() - origin.y()));
    }

    return result;
};

代码编译并且有效。请注意,我只输入一个向量,而不是向量作为initializer_list的单个元素。

1 个答案:

答案 0 :(得分:0)

此:

function(type_t<t> parameter)

而且:

function(std::initializer_list<type_t<t>> parameter)

不一样。请查看以下代码中的差异:

template <class T>
using type_t = T;

template <class T>
void function_1(type_t<T> /*parameter*/)
{

}

template <class T>
void function_2(std::initializer_list<type_t<T>> /*parameter*/)
{

}

int main()
{
    function_1(42);

    // function_2(42); - incorrect

    function_2({ 42 });
    //         ^-  -^
}

您不能只将type_t转换为initializer_list。你必须使用一个元素制作大括号括号列表并传递它。