在C 中,Haskell下划线有其他选择吗?

Is there an alternative for haskell underscore in c++?

本文关键字:其他 选择 下划线 Haskell      更新时间:2023-10-16

让我们想象我可能在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>>,则我都需要TR类型来了解比较的结果,但是在<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
 { };

以这种方式, JustEqualstd::true_type iff继承(如果和仅如果(,则两个类型是同一 TJust<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而不是JustNothing定义了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;
};

在线尝试!