這就是我想要的,一個「開關」型特徵,它返回具有滿足的條件==第一種類型:實現開關型特徵(與標準:: conditional_t鏈話費)
ext::select_t<condition1 == true, Type1,
condition2 == true, type2,
condition3 == true, type3>
等,並且能夠根據需要添加儘可能多的條件/類型對。
我可以用的std ::條件本身(隨便舉個例子)做到這一點:
template<typename Number,
typename Distribution = std::conditional_t<
// IF
std::is_integral<Number>::value,
// RETURN INT
std::uniform_int_distribution<Number>,
// ELSE
std::conditional_t<std::is_floating_point<Number>::value,
// RETURN REAL
std::uniform_real_distribution<Number>, void>>>
Number random(Number min, Number max)
{
static std::random_device rd;
static std::mt19937 mt(rd());
Distribution dist(min, max);
return dist(mt);
}
,你可以看到它決定在我想根據傳遞的條件/類型是什麼樣的分佈編譯時間。
顯然,如果我嘗試添加更多的條件,這可以得到真正的醜陋真實的快速,想象我想要其中的10個。
,所以我試圖建立一個,但悲慘地失敗了:
template<bool B, typename T>
struct cond
{
static constexpr bool value = B;
using type = T;
};
template<typename Head, typename... Tail>
struct select
{
using type = std::conditional_t<Head::value, typename Head::type, select<Tail...>>;
};
template<typename Head>
struct select<Head>
{
using type = std::conditional_t<Head::value, typename Head::type, void>;
};
template<typename Head, typename... Tail>
using select_t = typename select<Head, Tail...>::type;
我試圖使該鏈表的結構是這樣我就可以得到條件/類型「對」的原因,所以我可以得到任何數那些使用可變參數模板,但是這使得它更醜陋的(和不工作):
using Type = std::select_t<cond<false, void>,
cond<false, int>,
cond<true, std::string>>;
不僅看起來不那麼好,因爲我想最後的版本是,但它甚至不工作!它只在第一個條件爲真時才起作用。
有什麼可以遺漏嗎?我怎麼能以更乾淨的方式實現這一目標(至少對最終用戶而言)。
在此先感謝。
如果沒有一個條件是真的會怎樣? – jrok
如果沒有,它只是返回void。顯然,如果沒有真正的條件,最好的解決方案就是編譯失敗。取決於最終用戶的做法,void將(幾乎)總是使編譯失敗,但它可以以某種方式編譯正確並在代碼中產生錯誤,不知道如何解決這個問題。 – sap