gpt4 book ai didi

C++ 模板类 = 类型名

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

什么 template <class = typename T::type>方法?你能给我介绍一些博客,描述这个的规范吗?

问题最初来自sfinae on cpp reference的解释

template <typename A>
struct B { typedef typename A::type type; };

template <
class T,
class = typename T::type, // SFINAE failure if T has no member type
class U = typename B<T>::type // hard error if T has no member type
// (guaranteed to not occur as of C++14)
> void foo (int);

最佳答案

首先,我将解释typename T::type。这只是一个成员类型的访问。下面是访问成员类型的示例:

struct foo {
using bar = int;
};

int main() {
foo::bar var{};

// var has type int
}

那么为什么是 typename?它只是意味着我们想要访问一个类型。由于我们在模板中并且 T 是未知类型,因此 foo::bar 也可能意味着访问静态变量。为了消除歧义,我们表示我们想要通过显式键入 typename 来有效地访问类型。

好的,现在 class = 是什么意思?

class =typename = 含义相同。在声明模板类型参数时,我们引入然后使用classtypename:

template<typename A, typename B>
struct baz {};

但与 C++ 中的任何参数一样,名称是可选的。我本可以这样写,下面是完全等价的:

template<typename, typename>
struct baz {};

另外,你知道在函数参数中,我们可以指定默认值吗?像那样:

void func(int a, int b = 42);

int main () {
func(10); // parameter b value is 42
// We are using default value
}

我们也可以省略参数名:

void func(int, int = 42);

就像函数参数一样,模板参数可以省略它的名字,并且可以有一个默认值。

template<typename, typename = float>
struct baz {};

baz<int> b; // second parameter is float

综合考虑

现在我们有了这个声明:

template <
class T,
class = typename T::type, // SFINAE failure if T has no member type
class U = typename B<T>::type // hard error if T has no member type
// (guaranteed to not occur as of C++14)
> void foo (int);

这里我们声明了一个函数,它接受一个 int 作为参数,并且有三个模板参数。

第一个参数是一个简单的命名参数。名称是 T,它是一个类型模板参数。第二个也是一个类型参数,但是它没有名字。但是,它有一个默认值 T::type,它是 T 的成员类型。我们通过指定 typename 明确告诉编译器 T::type 必须是 T 的成员类型。第三个参数与第二个类似。

这就是 SFINAE 发挥作用的地方:当使用默认参数时,但作为成员类型的 T::type 不存在,您如何将第二个模板参数分配给它?我们不能。如果 T::type 不存在,我们不能分配第二个模板参数。但是编译器不会让它成为错误,而是会简单地尝试另一个函数,因为有可能调用另一个函数。

这与简单重载非常相似。你有 f 功能。它需要一个 float 参数,这是另一个需要 std::string 的重载。假设您调用 f(9.4f)。编译器是否因为 std::string 不能从 float 构造而阻塞?不!编译器并不愚蠢。它将尝试另一个重载,并找到 float 版本并调用它。在 SFINAE 中可以进行类似的类比。编译器不会停止,因为某处有一些重载需要模板参数中的未定义类型。它将尝试另一个重载。

关于C++ 模板类 = 类型名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49408294/

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