我希望调用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)
该文档说,我应该指出我希望通过传递in和out参数的别名指针来执行就地转换。
问:怎样才能in和out不违反严格别名规则的别名?
我对特定于GCC的扩展union持开放态度(即,即使标准将其声明为未定义行为,也可以使用s进行类型校正)。即使允许此扩展,联合也不能包含动态大小的数组(在此应用程序中这是必须的-我事先不知道变换长度)。有人有什么想法吗?提前致谢。
考虑下面的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++.
我有一个包含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*.
有没有办法做到这一点?