gpt4 book ai didi

c++ - 如何用SFINAE区分函数类型

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

我正在阅读《C++ 模板》一书。它提到 SFINAE(替换失败不是错误)主体可用于检测函数类型。代码示例:

template <typename T>
class IsFunctionT {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename U> static One test(...);
template<typename U> static Two test(U (*)[1]); // This test overloading I cannot understand
public:
enum { Yes = sizeof(IsFunctionT<T>::test<T>(0) == 1};
enum { No = !Yes };
};

我知道它的目的是找到不能归类为数组的函数,但它如何与 U (*)[1] 一起工作。我以前从未见过这个。

最佳答案

简而言之,SFINAE 通过替换类型来工作,如果表达式格式错误则不会给出硬失败。例如,你不能有一个函数数组,所以如果 U 是一个函数,替换将失败并且重载将被丢弃。现在正如评论所指出的那样,您单独发布的代码并不能涵盖所有情况。您需要额外的特化,即:

template<typename T>
class IsFunctionT<T&> {
public:
enum { Yes = 0 };
enum { No = !Yes };
};

template<>
class IsFunctionT<void> {
public:
enum { Yes = 0 };
enum { No = !Yes };
};

template<>
class IsFunctionT<void const> {
public:
enum { Yes = 0 };
enum { No = !Yes };
};

这是我从免费提供的 source code from the book 中提取的.

关于c++ - 如何用SFINAE区分函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48035782/

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