避免缩小有关创建C型数组的警告

时间:2019-03-06 19:32:52

标签: c++

在c ++ 11中,当前行为返回警告:

int arr[3] = { 0.0f, 1.0f, 2.0f};

基于以下post,我能够创建

template <class T, class ... Ts>
std::array<T, sizeof...( Ts )> make_non_narrowed_arr(Ts&& ... ts)
{
    return{ { static_cast<T>( ts )... } };
}

auto arr = make_not_narrowed_arr<int>(0.0f, 1.0f, 2.0f );

但是我希望回归成为经典的c数组,但是我却无法实现。到目前为止,我已经尝试过了,但是都没有编译。

template<class T, class ... Ts>
T[sizeof...( Ts )] make_non_narrowed_arr(Ts&& ... ts) {...};

template<class T, std::size_t N, class ... Ts>
T[N] make_non_narrowed_arr(Ts&& ... ts) {...};

template<class T, class ... Ts>
T* make_non_narrowed_arr(Ts&& ... ts) {...};

我想执行以下操作以制作一个没有警告的程序,而不在编译器中禁止它们。因此,这个post也不是我的解决方案。

对于该特定用法,我无法更改为std::array,因为此后需要在仅使用T*的c例程中使用它。

编辑:这是我所拥有的代码以及我想要更改的示例(并非确切的代码100%)。

该函数的问题在于,基于图像类型和通道,我执行对IPP例程的调用,并提供通用float *作为包装程序的输入。

void threshold(Image img, Image dst, float* th)
{
    // Sanitty ckeck on image, and bla bla...

    // Perform the call to ipp
    IppStatus sts = (IppStatus)0;
    switch(img.nbChan)
    {
        case 1:
        {
            switch(img.type)
            {
                case BYTE:
                {
                    Ipp8u arr[1] = {Th[0] };
                    sts = ippiThreshold_GTVal_8u_C1R(img.data, img.pitch, dst.data, dst.pitch, arr);
                    break;
                }
                case FLOAT:
                {
                    Ipp32f arr[1] = {Th[0] };
                    sts = ippiThreshold_GTVal_32f_C1R(img.data, img.pitch, dst.data, dst.pitch, arr);
                    break;
                }
            }        
            break;
        }
        case 3:
        {
            switch(img.type)
            {
                case BYTE:
                {
                    Ipp8u arr[3] = {Th[0], Th[1], Th[2]};
                    sts = ippiThreshold_GTVal_8u_C3R(img.data, img.pitch, dst.data, dst.pitch, arr);
                    break;
                }
                case FLOAT:
                {
                    Ipp32f arr[3] = {Th[0], Th[1], Th[2]};
                    sts = ippiThreshold_GTVal_32f_C3R(img.data, img.pitch, dst.data, dst.pitch, arr);
                    break;
                }
            } 
            break;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

只需使用std::array。您断言,由于需要与C样式的API接口而无法执行此操作,但这并不意味着您需要在代码中使用C样式的数组。

//C Header
void do_something(void * arr, size_t size);

//C++ Code
auto arr = make_non_narrowed_array<int>(0.f, 1.f, 2.f);
//If size is meant to be the memory footprint
do_something(arr.data(), sizeof(arr));
//If size is meant to be the number of elements
do_something(arr.data(), arr.size());

此代码无需使用C样式的数组。

如果您担心多余的样板代码,只需编写一个包装器即可。

template<typename T, size_t N> 
void cpp::do_something(std::array<T, N> const& arr) {
    do_something(arr.data(), arr.size() * sizeof(T));
}

答案 1 :(得分:0)

最后,在进行了所有讨论之后,尽管这不是一个超通用的功能,我还是重新考虑了我的问题,并尝试使一些简单的事情满足我的需求。

template<typename T, std::size_t N>
void no_narrow(float * const in, T(&out)[N])
{
    for ( int i = 0; i < N; i++ )
        out[i] = static_cast<T>( in[i] );
}

我这样称呼:

Ipp8u arr[3];
no_narrow(th, arr);