我想在 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不是必須的) - 必須是編譯時間
- 專案必須只定義一次(不想列舉陣列元素兩次)
- 必須是 header-only(cpp 檔案中定義的靜態 constexpr 成員不能作業,非 ODR 規范使用可以作業)
- 陣列大小必須是自動推斷的
該解決方案可以使用任何型別的 C 11 魔法。我希望我們能找出一些東西:)
更新:在原帖中,我忘記提及一個非常重要的事實:getRawBindings 在結構內。
uj5u.com熱心網友回復:
如何使用尾隨回傳型別?
#include <array>
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 {
template<typename... BINDINGS>
static constexpr auto getRawBindings(BINDINGS&&... bindings)
-> decltype(asConstArray(std::declval<BINDINGS>()...))
// ^^^ trailing return type
{
return asConstArray(std::forward<BINDINGS>(bindings)...);
}
};
然后你可以這樣呼叫getRawBindings():
constexpr auto raw_bingdings = DataBinding::getRawBindings(
DEF_BINDING(int, stateProp, stateParam),
DEF_BINDING(float, areaProp, areaParam)
// ...
);
uj5u.com熱心網友回復:
尾隨回傳型別應該可以完成這項作業:
struct DataBinding {
static constexpr auto getRawBindings()
-> decltype(
asConstArray(
DEF_BINDING(int, stateProp, stateParam), //BindingInfo constexpr object
DEF_BINDING(float, areaProp, areaParam) //BindingInfo constexpr object
//(...)
)
)
{
return asConstArray(
DEF_BINDING(int, stateProp, stateParam), //BindingInfo constexpr object
DEF_BINDING(float, areaProp, areaParam) //BindingInfo constexpr object
//(...)
);
}
};
為了避免重復,MACRO 可能會有所幫助:
#define RETURN(Expr) decltype(Expr) { return Expr; }
進而
struct DataBinding {
static constexpr auto getRawBindings()
-> RETURN(
asConstArray(
DEF_BINDING(int, stateProp, stateParam), //BindingInfo constexpr object
DEF_BINDING(float, areaProp, areaParam) //BindingInfo constexpr object
//(...)
)
)
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312612.html
下一篇:顯式模板實體化示例
