gpt4 book ai didi

c++ - SFINAE 检查运算符的存在(没有 decltype)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:48 25 4
gpt4 key购买 nike

我正在尝试做我学校的一个旧项目,它处理 C++98 中的元编程。我挣扎的部分是关于 SFINAE。

主题说我应该检查 operator<<通过使用这样的结构在流对象和另一个对象之间工作:

template<typename Stream, typename Object>
struct IsPrintable;

它说我应该用“两个空引用”写一个奇怪的行,我想它应该是这样的:

sizeof(*(static_cast<Stream *>(NULL)) << *(static_cast<Object *>(NULL)))

它在运算符受支持时工作,但在不支持时无法编译。我不知道我在哪里失败了,这是文件:

template<typename Flux, typename Object>                                                                                                                                                                                                       
struct IsPrintable
{
typedef char yes[1];
typedef char no[2];

template<size_t N>
struct Test
{
typedef size_t type;
};

template<typename U>
static yes &isPrintable(U * = 0);

template<typename>
static no &isPrintable(...);

static const bool value = sizeof(isPrintable<Test<sizeof(*(static_cast<Flux *>(NULL)) << *(static_cast<Object *>(NULL)))> >(0)) == sizeof(yes);

};

主题明确表示要使用一个以 size_t 作为参数的类,并且 isPrintable 方法应该使用指向此类实例的 NULL 指针。另外,带有 static_cast 的丑陋表达式应该用于类型定义,我试图对其进行 typedef,但编译器对我尖叫。

因为我对此很陌生,所以我没有得到所有的东西,我知道有一些方法可以用 decltype 来简化它运算符,但该项目的目标是在 C++98 中执行此操作,如果我稍后找到该类型的一些代码,它可能会有用。

最佳答案

#include <cstddef>

template<typename Flux, typename Object>
struct IsPrintable
{
typedef char yes[1];
typedef char no[2];

template <std::size_t N>
struct SFINAE {};

template <typename F, typename O>
static yes& isPrintable(SFINAE<sizeof( *static_cast<F*>(NULL) << *static_cast<O*>(NULL) )>* = 0);

template <typename F, typename O>
static no& isPrintable(...);

static const bool value = sizeof(isPrintable<Flux, Object>(NULL)) == sizeof(yes);
};

DEMO

关于c++ - SFINAE 检查运算符的存在(没有 decltype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26236598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com