这就是我想要的,一个“开关”型特征,它返回具有满足的条件==第一种类型:实现开关型特征(与标准:: 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