c++ - 避免缩小 c 样式数组创建时的警告

标签 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% 的确切代码),其中包含我所拥有的代码以及我想要更改的内容。

该函数的问题在于,我根据图像类型和 channel 执行对 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;
        }
    }
}

最佳答案

只需使用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));
}

关于c++ - 避免缩小 c 样式数组创建时的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55030898/

相关文章:

c++ - boost 图形复制和删除顶点

c++ - 如何在 C++ win32 API 中使用 pwdlastset 值和 maxpwdage 值获取 pwdexpirydate?

c++ - 正确设置 bgfx(和项目结构)

c++ - 无法使用mysql++连接到SQL数据库

c++ - 编译器不能在 Vector_const_iterator 和 Vector_iterator 之间使用 "convert",即使两者的方法都可用

c++ - 如何实现一致的方法来检测鼠标按钮是否被按住

c++ - 如何设置 boost.log 来限制日志文件的数量

c++ - 计算精度 c++ Cplex

c++ - 是否有可能在 Qt QGraphicsScene 中获得顶级项目?

c++ - 无法将带有俄语字符的 wstring 写入文件