在C 中,Haskell下划线有其他选择吗?
Is there an alternative for haskell underscore in c++?
让我们想象我可能在C 中像Haskell一样。例如,它可以像这样实现:
template<typename T, typename val>
struct Maybe;
template<typename val> struct Maybe<std::true_type, val> {
using value = val;
};
template<> struct Maybe<std::false_type, void> {
};
template<typename val>
using Just = Maybe<std::true_type, val>;
using Nothing = Maybe<std::false_type, void>;
我想通过使用"均等"函数来比较它们:
template<typename T, typename R>
struct equal;
如果我有实例<Just<T>, Just<R>>
,则我都需要T
和R
类型来了解比较的结果,但是在<Just<T>, Nothing>
或<Nothing, Just<T>>
的情况下,我不需要对T类型T。(Just _
(,但是C ?
我相信_
是模板参数的有效标识符,但是省略typename _
将阻止其被识别为模板参数。因此,您能得到的最接近的就是这样:
template<typename T, typename R>
struct equal;
template<typename T, typename R>
struct equal<Just<T>, Just<R>> {
using value = typename std::conditional<std::is_same<T, R>::value, True, False>::type;
};
template<typename _>
struct equal<Just<_>, Nothing> {
using value = False;
};
template<typename _>
struct equal<Nothing, Just<_>> {
using value = False;
};
template<>
struct equal<Nothing, Nothing> {
using value = True;
};
不确定要了解您想要什么,但是...我想您想要一些
template <typename, typename>
struct JustEqual : public std::false_type
{ };
template <typename T>
struct JustEqual<Just<T>, Just<T>> : public std::true_type
{ };
以这种方式, JustEqual
从 std::true_type
iff继承(如果和仅如果(,则两个类型是同一 T
的 Just<T>
类型。
当TypEname为不同类型的Just
类型,或Just
类型和Nothing
或两个Nothing
时,JustEqual
专业化不匹配,仅是主版本(从std::false_type
继承(。
观察,这样,JustEqual<Nothing, Nothing>
仅与主要版本匹配std::false_type
。我不清楚这是您想要的。
如果您想要JustEqual<Nothing, Nothing>
从std::true_type
继承,则可以添加特定的专业化
template <>
struct JustEqual<Nothing, Nothing> : public std::true_type
{ };
这不会回答您有关模板参数通配符类型的问题。
查看您的特定问题,如果您用Maybe
而不是Just
和Nothing
定义了equal
的定义。重要的是Maybe
的两个参数都是相同的,因此Nothing
也是如此。
这允许简化equal
的定义,因为现在可以默认为False
。
template<typename, typename>
struct equal {
using value = False;
};
template<typename B, typename V>
struct equal<Maybe<B, V>, Maybe<B, V>> {
using value = True;
};
在线尝试!
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 如何使用默认参数等选择模板专业化
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- cv::cuda::setTo()是否有其他选择
- 有没有其他选择可以打破?
- 除了使用 #define 进行条件编译之外,还有其他选择吗?
- 谷神星求解器:残差函子使用的可变对象是否良好实践?还有什么其他选择
- 在C 中,Haskell下划线有其他选择吗?
- 有没有机会触发一个不知道拥有队列的kevent?还有其他选择吗?
- 除了使用OpenCV的imdecode之外,还有其他选择吗?太慢了
- C++ 如何通过可选的typedef,使用SFINAE或其他方式选择类
- 从一个组合框中选择项目,然后从其他组合框中删除该项目
- 如何存储需要随机选择和删除的数据,矢量,哈希表或其他
- 除了制作类的const版本,还有其他选择吗
- 为什么glReadPixels这么慢,有没有其他选择?
- 除了这一长串"if argA == argB do ..."之外,还有其他选择吗?
- 从下拉框中选择其他项目时更改选项卡小部件的 currentIndex()
- Objective-c选择器,其他语言如c++, python, ruby, java, javascript有类似的东
- 是否有可能在C中使用系统api启动一个kill命令?如果没有其他选择的话