小编Sum*_*ood的帖子

在不违反严格的别名规则的情况下调用FFTW的就地实数到复杂变换

我希望调用fftw的就地实到复杂转换函数,该函数具有以下签名:

fftw_plan fftw_plan_dft_r2c_1d(
    int n,             // transform length
    double* in,        // pointer to input array
    fftw_complex* out, // pointer to output array
    unsigned flags     // flags
);
Run Code Online (Sandbox Code Playgroud)

该文档说,我应该指出我希望通过传递inout参数的别名指针来执行就地转换。


问:怎样才能inout不违反严格别名规则的别名?


我对特定于GCC的扩展union持开放态度(即,即使标准将其声明为未定义行为,也可以使用s进行类型校正)。即使允许此扩展,联合也不能包含动态大小的数组(在此应用程序中这是必须的-我事先不知道变换长度)。有人有什么想法吗?提前致谢。

c++ gcc strict-aliasing fftw c++17

8
推荐指数
1
解决办法
155
查看次数

C++ 17可以处理嵌套的可变参数模板吗?

考虑下面的C++ 17代码,该代码测试一组枚举值以查看该集合中是否包含另一个枚举值:

enum Flag { val1, val2, val3, val4, val5 };

template<Flag arg> struct Value {
    template<Flag... set> struct IsIn {
        static constexpr bool value =
            static_cast<bool>(((set == arg) || ...));
    };
};
Run Code Online (Sandbox Code Playgroud)

这按预期工作:

bool x = Value<val4>::IsIn<val1, val2, val5>::value;
// x == false

bool y = Value<val2>::IsIn<val3, val2>::value;
// y == true
Run Code Online (Sandbox Code Playgroud)

但是,我希望测试是否所有一组值都包含在另一个集合中,如下所示:

template<Flag... args> struct Values {
    template<Flag... set> struct AreIn {
        static constexpr bool value =
            static_cast<bool>((Value<args>::IsIn<set...>::value && ...));
    };
};
Run Code Online (Sandbox Code Playgroud)

以上内容不适用于GCC 7.3或Clang 5.0; 他们都给出了相当神秘的答案,这些答案几乎无法洞察问题.鉴于允许模板参数列表中的参数包扩展(只要模板支持扩展),我很难弄清楚为什么这不是合法的C++.

c++ variadic-templates c++17

6
推荐指数
1
解决办法
408
查看次数

C++函数可以返回指向已知长度数组的指针吗?

我有一个包含s static constexpr数组的类,const char我想通过一个c_str()方法提供它:

class my_class {
  private:
    static constexpr const char c_str_[6] = {'c', 'h', 'a', 'r', 's', '\0'};
  public:
    static constexpr const char* c_str() {
      return c_str_;
    }
};
Run Code Online (Sandbox Code Playgroud)

这有效,但有一个不幸的结果:它从类型中删除指向数组的长度:

decltype(my_class::c_str()) // equivalent to const char*

Run Code Online (Sandbox Code Playgroud)

我真正喜欢的是实现这个目标的一些方法:

decltype(my_class::c_str()) // equivalent to const char[6]
Run Code Online (Sandbox Code Playgroud)

我知道在任何一种情况下返回的对象都是指针; 我只想保留类型中指向数组的长度.样怎么样decltype("string literal")const char[15],没有const char*.

有没有办法做到这一点?

c++ c++11 c++14 c++17

4
推荐指数
2
解决办法
307
查看次数

标签 统计

c++ ×3

c++17 ×3

c++11 ×1

c++14 ×1

fftw ×1

gcc ×1

strict-aliasing ×1

variadic-templates ×1