【发布时间】:2021-11-26 07:05:26
【问题描述】:
我想在 C++11 中实现这个功能(或类似的功能,请参阅下面的要求):
template<typename... ARGS>
constexpr std::array<const typename std::common_type<ARGS...>::type, sizeof...(ARGS)> asConstArray(ARGS&&... args)
{
return {std::forward<ARGS>(args)...};
}
struct DataBinding {
static constexpr auto getRawBindings()
// HERE ^- C++14, deduced to std::array<const BindingInfo, 2> in this case
{
return asConstArray(
DEF_BINDING(int, stateProp, stateParam), //BindingInfo constexpr object
DEF_BINDING(float, areaProp, areaParam) //BindingInfo constexpr object
//(...)
);
}
};
如你所见,我想介绍一个基于宏的接口(这是必要的,它可以做很多其他与 Qt 相关的魔法)。
DEF_BINDING 返回用户定义结构的 constexpr 对象(BindingInfo - 它包含一些 const char* 和 size_t 成员,它可以替换为任何可以包含相同的结构或模板)。
我不想强迫程序员手动计算绑定,因为这很不方便。上面的解决方案是我能想到的最接近的解决方案,但我想在 C++11 中解决以下问题:
- 需要返回一个元素数组(数组之类,使用
std::array是 不是必须的) - 必须是编译时
- 项目只能定义一次(不想枚举数组元素两次)
- 必须是仅标头(静态 constexpr 成员定义在 cpp 文件不能工作,非 ODR 规定的使用可以工作)
- 数组大小必须是自动推导出来的
该解决方案可以使用任何类型的 C++11 魔法。我希望我们能弄清楚一些事情:)
更新:在原来的帖子中,我忘了提到一个非常重要的事实:getRawBindings 在结构中。
【问题讨论】:
-
不清楚实际问题是什么。您有想要移植到 C++11 或其他东西的 C++14 代码?
-
是的,我的帖子开头的问题是:“我想在 C++11 中实现这个功能(或类似的功能,请参阅下面的要求)”
-
我只是想知道,既然你的 constexpr 没有参数,为什么不能直接将数组实例化为常量? (使用宏获取程序员输入)
-
或者只是使用可变参数模板来获取绑定列表。从那里您可以使用 sizeof... 来计算参数的数量,因此在定义返回类型时不需要 auto。
-
@LaurentJospin 因为请求。 4:必须是header-only(cpp文件中定义的静态constexpr成员不能工作,non-ODR规范使用可以工作)。我修改了帖子以强调它。
标签: c++ arrays c++11 templates compile-time