当前位置:  开发笔记 > 编程语言 > 正文

是否可以构建一个惰性条件元函数

如何解决《是否可以构建一个惰性条件元函数》经验,为你挑选了0个好方法。

假设我想用来std::conditional确定一个类型,如果类型是一个vector<...>返回将是a vector<...>::size_type,如果不是,它将是int.(只是一个例子).

一种天真的使用方式std::conditional:

template struct is_vector : std::false_type{};
template struct is_vector> : std::true_type{};

template
using my_size_type = typename std::conditional<
    not is_vector::value, 
    int, 
    C::size_type // note that this line only makes sense when condition is false
>::type;

但是这会失败,因为如果C是a double,double::size_type则会给出错误,即使那是第二个错误选项的评估.

所以,我很想知道是否存在一种lazy_conditional未评估错误(或第二个错误)语句的情况.

我在这里找到了一些东西:https://stackoverflow.com/a/5317659/225186但我不知道如何使用它我的例子.


请注意,我知道如何在不使用的情况下获得相同的结果std::conditional:

template struct my_size_type{typedef int type;};
template struct my_size_type>{typedef std::vector::size_type type;};

问题是,是否存在lazy_conditional以某种方式封装了一个std::conditional被短路的东西.


在一些试验错误之后,我设法使用/sf/ask/17360801/中的想法并进行以下操作.它也让我觉得不可能写,std::lazy_conditional因为C::size_type在任何表达式中都不会出现先验,所以需要两步表达式.

template struct false_case{
    typedef void type;
};
template struct false_case{
    typedef typename C::size_type type;
};

template
using size_type = typename std::conditional<
    not is_vector::value, 
    int, 
    typename false_case::value>::type
>::type;

我甚至无法将其浓缩成一个宏,因为每个案例都不同.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有