我想做這樣的事情。
if (flow1)
{
typedef template_class<user_defined_type1> x;
}
else if (flow2)
{
typedef template_class<user_defined_type2> x;
}
else if (flow3)
{
typedef template_class<user_defined_type3> x;
}
else else
{
typedef template_class<user_defined_type4> x;
我檢查了這個問題的答案如何在C 中制作一個有條件的型別定義,但我不確定如果我有超過1個型別,我如何使用std::conditional ? 是否有可能做這樣的事情呢?
uj5u.com熱心網友回復:
使用多個嵌套的std::conditional,例如:
#include <type_traits>/span>
using x = std::conditional<flow1,
template_class<user_defined_type1>。
std::conditional<flow2,
template_class<user_defined_type2>。
std::conditional<flow3,
template_class<user_defined_type3>。
template_class<user_defined_type4>
>:型別
>:型別
>::型別。
/* 或者,在C 14中使用std::conditional_t。
using x = std::conditional_t<flow1,
template_class<user_defined_type1>。
std::conditional_t<flow2,
template_class<user_defined_type2>。
std::conditional_t<flow3,
template_class<user_defined_type3>。
template_class<user_defined_type4>
>
>
>。
*/
或者:
#include <type_traits>
using x = template_class<
std::conditional<flow1,
user_defined_type1,
std::conditional<flow2,
user_defined_type2。
std::conditional<flow3,
user_defined_type3,
用戶_定義的_型別4
>::型別
>::型別
>::型別
>。
/* 或者,在C 14中使用std::conditional_t。
using x = template_class<
std::conditional_t<flow1,
user_defined_type1。
std::conditional_t<flow2,
user_defined_type2。
std::conditional_t<flow3,
user_defined_type3。
用戶定義的型別4
>
>
>
>。
*/
uj5u.com熱心網友回復:
你可以嵌套std::conditional:
// if (flow1) -> type1
using x = std::conditional_t<flow1, template_class< user_defined_type1>。
// else if (flow2) -> type2
std::conditional_t< flow2, template_class<user_defined_type2> 。
// else if (flow3) -> type3
std::conditional_t<flow3,template_class<user_defined_type3>。
// else -> type4
template_class<user_defined_type4>>>>。
這當然只有在flow是一個常量運算式時才有效。
uj5u.com熱心網友回復:
下面是我對C 的一點復習,它通過還原到元組索引來通用地解決這個問題(Oops,需要C 17)。
#include <cstddef>/span>
#include <tuple>
//helper function
template <bool 首先,bool ...。其他>。
constexpr auto first_true_index() -> size_t
{
if constexpr(First)
{
return 0;
}
else if constexpr(sizeof...(Rest)==0)
{
return 1。
}
else; }
{
return 1 first_true_index<Rest...>()。
}
}
// input
struct type1 {};
struct type2 {};
struct type3 {};
struct type4 {};
constexpr bool flow1 = false, flow2 = true, flow3 = true;
/span>實作
using types = std::tuple<type1, type2, type3, type4> 。
constexpr auto index = first_true_index<flow1, flow2, flow3>()。
using selected_type = std::tuple_element_t<index, types> 。
//test
static_assert(std::is_same_v<selected_type, type2>)。
int main()
{
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/314183.html
標籤:
