variadic-templates 相关问题

可变参数模板是采用可变数量参数的模板。

gcc 和 clang 不同意使用别名模板作为模板模板参数

下面的代码使用 gcc 14.1.1 进行编译,但 clang 18.1.8 不接受它。哪一个是正确的并且有任何解决方法吗? 模板 类 T> 结构体{ 温度... 下面的代码使用 gcc 14.1.1 进行编译,但 clang 18.1.8 不接受它。哪一个是正确的,有什么解决方法吗? template <template <typename...> class T> struct s { template <typename... U> using type = T<U...>; }; template <typename T> class c {}; template <typename T> using a = c<T>; int main() { typename s<c>::type<int>{}; typename s<a>::type<int>{}; // Causing the error return 0; } ❯ clang++ -Wall -std=c++23 -pedantic text.cpp -o test test.cpp:7:20: error: pack expansion used as argument for non-pack parameter of alias template 7 | using type = T<U...>; | ^~~~ 编辑: 将别名模板设为可变参数可以使用 clang 进行编译,但模板别名是由用户创建的,库无法控制它。 template <typename... T> using a = c<T...>; 哪一个是正确的[...]? Clang 错了。 A class-template 和 alias-template 是同义词1;它们都可以用作模板模板参数的模板参数,可互换使用2。 1[dcl.typedef]/1 使用 typedef 说明符声明的名称成为 typedef 名称。 typedef-name 命名与标识符 ([dcl.decl]) 或 simple-template-id ([temp.pre]) 关联的类型;因此,typedef-name 是另一种类型的同义词。 typedef-name 不会像类声明 ([class.name]) 或枚举声明 ([dcl.enum]) 那样引入新类型。 2[temp.arg]/1 模板模板参数的模板参数应是类模板或别名模板的名称,表示为 id-expression。将模板模板参数与相应参数匹配时,仅考虑主模板;即使参数列表与模板模板参数匹配,也不会考虑部分特化。

回答 1 投票 0

根据条件从另一个元组中创建一个引用元组

我有一个模板化结构 ContainerInner,它有一个元组,其中包含来自其可变参数模板的类型向量,以及一个包含 ContainerInner 元组的结构 Container,在其 tem...

回答 1 投票 0

是否可以在成员模板中使用类模板参数包的修改版本?

我正在尝试编写一个带有可变参数模板参数包的类模板,该参数包分为两组参数。这些应在成员模板中使用。 模板

回答 2 投票 0

如何在 C++ 中基于模板的事件系统中预绑定参数

我的游戏引擎中有一个事件系统,由两个主要组件组成:Event 和 EventCallback。 事件.h: #ifndef _EVENT_H_ #定义_EVENT_H_ #include“EventCallback.h” #包括<...

回答 1 投票 0

推导参数包中的参数数量

在C++中,我试图弄清楚如何推断出函数参数包的大小,以及如何推断出特定类型(例如整数)的参数数量 模板&...

回答 1 投票 0

C++ 中带有类型检查的可变参数模板

我需要一个驱动程序接口,仅提供以下类型的一组 send() 函数: 无效发送(u8 a); 无效发送(u8 a,u8 b); 无效发送(u8 a,u8 b,u8 c); 无效发送(u8 *a,...

回答 3 投票 0

C++ 中具有类型检查的变量模板

我需要一个驱动程序接口,仅提供以下类型的一组 send() 函数: 无效发送(u8 a); 无效发送(u8 a,u8 b); 无效发送(u8 a,u8 b,u8 c); 无效发送(u8 *a,...

回答 1 投票 0

递归可变参数 C++ 模板

所以, 我有以下模板,将两个单位相乘,例如速度和时间。 //!两个单元的乘积 模板 类型名称 QuantityLhs,模板<

回答 1 投票 0

在 C++ 中从 void** 数组重新转换可变参数

我正在开发一个项目,需要将可变参数转换为 void** 数组,将它们传递给 lambda 函数,然后正确地将它们转换回原始类型以在自定义中使用

回答 1 投票 0

Clang 无法匹配可变参数模板模板专业化

我有以下代码: #包括 #包括 模板 结构匹配:std::false_type {}; 模板 C 类,

回答 1 投票 0

如何使用 T 类型的 nRow*nCol 参数来声明构造函数?

我是 C++ 新手,刚刚学习如何使用模板。 我想编写一个具有以下模板参数的 Matrix 类: 模板< int nRow ,int nCol ,typename T = double > ZD 类...

回答 1 投票 0

Matrix<T> 如何使用 T 类型的 nRow*nCol 参数声明构造函数

我是C++新手,刚刚学会了如何使用模板。 我想编写一个具有以下模板参数的 Matrix 类: 模板< int nRow ,int nCol ,typename T = double > ZDMa 类...

回答 1 投票 0

如何在可变参数模板函数中使用source_location?

C++20 功能 std::source_location 用于捕获有关调用函数的上下文的信息。 当我尝试将它与可变参数模板函数一起使用时,我遇到了一个问题...

回答 8 投票 0

如何制作变量is_same?

如何制作一个类模板,返回其任何可变参数类型是否等于第一种类型。我希望能够做到这一点: is_same::值; // 如果 T 是 A 之一,则为 true...

回答 7 投票 0

C++ 将参数包扩展为数组元组

我想实例化一个类 模板 X类{ 私人的: std::tuple,std::array,...> m_tuples; // 对于 Ar...

回答 1 投票 0

可变参数模板上下文中“...”标记的规则是什么?

在 C++11 中,有像这样的可变参数模板: 模板< class T, class... Args > unique_ptr make_unique( 参数&&... 参数 ) { 返回 unique_ptr(新 T(std::

回答 2 投票 0

如何从模板函数中打印调用函数的行号?

我正在实现一个日志功能,它会记录代码的行号。代码片段如下: #包括 使用命名空间 std; char m_buffer[500]; 模板<

回答 1 投票 0

C++17 中可能存在 is_variadic 类型特征吗?

在 C++17 中,是否可以设计一个类型特征来检测可调用对象是否是可变参数(因此可以采用任意长的参数数量)? 模板 是否可以在C++17中设计一个类型特征来检测可调用对象是否是可变参数(因此可以采用任意长的参数)? template <class Callable> struct is_variadic; 我目前不知道如何做到这一点,但我无法说服自己这是不可行的。那么如果可行的话会是什么样子? 如果函数类型是可变参数,则 is_variadic 类型特征为 true。 这意味着类型特征必须部分特化才能接受可以接受可变数量参数的函数类型。 template <typename> struct is_variadic : std::false_type {}; template <typename R, typename ...Args> struct is_variadic<R(Args..., ...)> : std::true_type {};

回答 1 投票 0

如何提取和使用“可变参数”模板参数及其类型? [已关闭]

我如何提取和使用 C++ 类的变量模板参数中定义的类型,而不是定义以下类的多个重复项,这些重复项仅延迟数量和...

回答 2 投票 0

可变模板无法编译

#包括 模板 结构体TransformFunc; 模板 类 TransformFunc #include <stdio.h> template <typename FuncType, FuncType> struct TransformFunc; template <typename Arg, typename... Args, void(*func)(Arg, Args...)> class TransformFunc<void(*)(Arg, Args...), func> { public: static void apply(Arg arg, Args... args) { func(arg, args...); } }; void test1(int x) { printf("test1: int%d\n", x); } void test2 (int x, float y) { printf("test2: int%d float%f\n", x, y); } int main(int, char **) { TransformFunc<decltype(&test1), &test1>::apply(5); TransformFunc<decltype(&test2), &test2>::apply(5, 1.23f); // Error here. return 0; } 1>------ Build started: Project: main, Configuration: Debug x64 ------ 1> main.cpp 1>main.cpp(33): error C2440: 'specialization' : cannot convert from 'void (__cdecl *)(int,float)' to 'void (__cdecl *)(int)' 1> This conversion requires a reinterpret_cast, a C-style cast or function-style cast 1> main.cpp(33) : see reference to class template instantiation 'TransformFunc<void (__cdecl *)(int,float),void test2(int,float)>' being compiled 1>main.cpp(33): error C2973: 'TransformFunc<void(__cdecl *)(Arg,Args...),func>' : invalid template argument 'void (__cdecl *)(int,float)' 1> main.cpp(9) : see declaration of 'TransformFunc<void(__cdecl *)(Arg,Args...),func>' ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 我不明白为什么 test2 实例化无法编译。有什么想法吗? 我不明白为什么 test2 实例化无法编译 该程序格式良好,截至 2024 年 5 月已被所有 3 个主要编译器接受。 演示。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.