首页  >  文章  >  后端开发  >  如何在 C 初始化列表中显式调用模板构造函数?

如何在 C 初始化列表中显式调用模板构造函数?

Linda Hamilton
Linda Hamilton原创
2024-11-27 08:28:10634浏览

How to Explicitly Invoke Template Constructors in C   Initializer Lists?

初始化列表中显式调用模板构造函数

在 C 中,在类构造函数中初始化对象时如何调用显式模板构造函数?考虑以下示例:

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} // This approach does not work
    T t;
};

问题陈述

提供的代码尝试在 U 的初始值设定项列表中显式调用 T 的模板构造函数。但是,此方法失败。

答案

C 中不支持显式调用初始值设定项列表中的模板构造函数。此限制源于这样一个事实:模板参数通常是在函数模板名称之后使用尖括号指定的。由于构造函数没有自己的名称,因此没有传统的方法可以将模板参数传递给它们。

说明

C 标准在第 14.8.1/7 节中明确指出了此限制:

[Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. ]

解决方法

一种解决方法是利用辅助类型将模板参数传递为接受类型标识的构造函数的参数。例如:

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};

在这种情况下,Boost 中定义的身份模板可以用来包装模板参数。或者,在 C 20 中,可以使用 std::type_identity 类型。

参考

  • [std::type_identity](https://en.cppreference.com/w /cpp/types/type_identity)

以上是如何在 C 初始化列表中显式调用模板构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn