variadic-templates 相关问题

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

有没有办法存储特定类型C++的可变参数模板

假设我有以下场景,我正在打印 std::size_t 类型的模板。 模板 void print_sizes(){std::cout< 假设我有以下场景,其中我正在打印 std::size_t 类型的模板。 template<std::size_t st> void print_sizes(){std::cout<<st<<std::endl;} template<std::size_t st, std::size_t M, std::size_t... Rest> void print_sizes(){ std::cout<<st<<std::endl; } int main(){ print_sizes<10, 12, 3>(); return 0; } 以上内容完全有效。但是,我想知道是否有一种方法可以存储 10,12,3 可变参数模板,如下所示: template<std::size_t st> void print_sizes(){std::cout<<st<<std::endl;} template<std::size_t st, std::size_t M, std::size_t... Rest> void print_sizes(){ std::cout<<st<<std::endl; print_sizes<M, Rest...>(); } using example = 10,12,3; int main(){ print_sizes<example>(); return 0; } 显然,这不起作用并会引发错误。有没有办法做这样的事情? 你不能轻易存储10, 12, 3参数包,但你可以存储实例化的模板: #include <iostream> template<std::size_t st> void print_sizes(){std::cout<<st<<std::endl;} template<std::size_t st, std::size_t M, std::size_t... Rest> void print_sizes(){ std::cout<<st<<std::endl; print_sizes<M, Rest...>(); } int main(){ auto f = print_sizes<10, 12, 3>; // save instantiated template f(); // invoke it. return 0; }

回答 1 投票 0

可变参数模板推演失败

我正在尝试使操作管道类型安全。下面的代码已大大简化,但我相信它具有必要的部分。 我已经尝试了可变参数的大多数组合和顺序...

回答 1 投票 0

中间带有可变参数包的函数的显式实例化

我有一个可变参数模板函数,其中常规模板参数遵循参数包: 模板 无效 foo(参数...); 我想声明 extern

回答 1 投票 0

C++ 可变参数模板函数错误 C2672“未找到匹配的重载函数”

我目前正在尝试熟悉 C++ 中的可变参数模板,但我有点遇到了某种障碍,其中每个递归实现都会给我错误 C2672。甚至是我的例子

回答 1 投票 0

C++ 非类型可变参数模板包不适用于宏函数

我在下面有一个小例子,第一个例子工作得很好,但是第二个例子出现了一个错误,我得到错误 no member named 'handle_func' in 'test_nontype_variadic' 工作考试...

回答 1 投票 0

当 constexpr 时,C++ 可变参数模板“不包含参数包”是否应该避免?

我正在使用一些 C++ 20 功能(例如折叠运算符)来在编译时获取可变参数模板的大小。然后,我在 constexpr 中使用这个大小,以避免使用任何可变参数...

回答 1 投票 0

如何获取元组c++的前N个元素?

假设我有一个如下所示的函数,如何获取元组的前 n 个元素? 模板 无效 foo(Ts...ts){ std::tuple 所有元素...

回答 1 投票 0

您可以为带有可变参数模板的类函数提供默认参数吗?

如果我想使用可变参数模板有一个默认参数,以下内容是完全有效的。我想知道是否可以在类中复制类似的东西: 内联静态常量表达式自动

回答 1 投票 0

专门化可变参数模板以跳过非引用参数

我正在为一些客户端-服务器函数调用编写一个包装器,我需要一种方法在实际调用之前或之后设置一些输出参数。示例代码如下: #包括 #包括...

回答 1 投票 0

双折表达式替换分支语句

我试图弄清楚如何使用折叠表达式(或其他元编程技术)来摆脱下面代码片段中的“if else”分支。 模板 是...

回答 1 投票 0

带有 printf 参数检查的可变参数模板

我有一个 printf 风格的函数,它接受可变数量的参数。这是我的出发点: #包括 #包括 void MyPrint (const char* fmt,...) { va_l...

回答 2 投票 0

C++ 数据数组初始化

我需要初始化一个uint8_t数组, 其中大部分是常量(固定标识符),一些元素编码下一节的长度,一些元素是可变的。 uint8_t 数据[] = { 0x01、0x05、0x...

回答 1 投票 0

使用模板参数列表中的参数包

我想编写一个抽象 Pipeline 类,它获取一些具有特定签名的函数作为模板参数,并根据输入数据的解析阶段运行它们。这是我的代码

回答 1 投票 0

如何在cpp中实现可读的模板for循环语法?

我想编写一些头文件,包含该文件使我能够以可访问的语法编写模板for循环。我该如何实施? (参见底部的我的最佳尝试)。 接下来是

回答 1 投票 0

使用C++ CRTP,如何推断派生类中函数的参数?

我试图从 CRTP 基类中推断函数的返回类型和参数,以便“包装”函子。 从基本的 CRTP 模式开始: 模板

回答 3 投票 0

函数参数包专业化

模板 无效 foo(T , Ts ... ) { } 模板 空条(T , Ts ... ) { } int main() { foo(1, 'c'); // 好吧...

回答 1 投票 0

从可变参数模板生成 std::function 的 std::tuple

假设有一个像这样的函数 模板 void f(std::tuple & 数据); 我想生成一个 std::function 的 std::tuple,每个都有这个签名:std::function<

回答 1 投票 0

有没有办法使用 C++ 中的可变参数模板检索类型的内部类型?

假设我有一个使用可变参数模板的类型: 模板 结构体外部 { // 使用 Inner = 捕获 ...Args ???; } 我如何定义“内在”以便我可以...

回答 1 投票 0

模板函数覆盖

我正在尝试为基于类型的函数创建一个专门化的模板 例如,对于我所拥有的类型号 模板 我正在尝试为基于类型的函数创建一个专业化模板 例如对于我拥有的型号 template <class ElementType, typename = typename TEnableIf<TNot<TIsSame<ElementType, double>>::Value>::Type> void WriteExtras(IGLTFJsonWriter& Writer, const FString& Key, const TSharedPtr<FJsonValue>& Value) const { Writer.Write(Key, float(Value->AsNumber())); // Perform further processing or write logic for double } 现在我想要多一个定义,但对于 bool ......但如果我尝试这样做 template <class ElementType, typename = typename TEnableIf<TNot<TIsSame<ElementType, bool>>::Value>::Type> void WriteExtras(IGLTFJsonWriter& Writer, const FString& Key, const TSharedPtr<FJsonValue>& Value) const { Writer.Write(Key, Value->AsBool()); // Perform further processing or write logic for double } 我收到错误“函数已定义” 我将函数模板称为 WriteExtras< EJson>(Writer,Key,Pair.Value); EJson 是一个枚举 enum class EJson { None, Null, String, Number, Boolean, Array, Object }; 这两个函数实际上声明了同一个函数: template <class ElementType, typename = typename TEnableIf<TNot<TIsSame<ElementType, double>>::Value>::Type> void WriteExtras(IGLTFJsonWriter& Writer, const FString& Key, const TSharedPtr<FJsonValue>& Value) const; template <class ElementType, typename = typename TEnableIf<TNot<TIsSame<ElementType, bool>>::Value>::Type> void WriteExtras(IGLTFJsonWriter& Writer, const FString& Key, const TSharedPtr<FJsonValue>& Value) const; 它们之间的唯一区别是模板参数的默认参数,但这并没有使其中之一成为单独的实体。就像写作一样: int foo(int x = 0); int foo(int x = 1); 您需要在函数签名中的其他地方使用 std::enable_if (或您的自定义模仿)进行 SFINAE,例如参数、noexcept 规范、返回类型等。对于函数,最好的方法之一是使用返回类型,因为它不会改变模板参数列表: // convenience alias (since C++14) template <bool Condition, typename T = void> using EnableIf_t = typename EnableIf<Condition, T>::type; template <class ElementType> auto WriteExtras(IGLTFJsonWriter& Writer, const FString& Key, const TSharedPtr<FJsonValue>& Value) const -> TEnableIf_t<not TIsSame<ElementType, double>::Value>; template <class ElementType> auto WriteExtras(IGLTFJsonWriter& Writer, const FString& Key, const TSharedPtr<FJsonValue>& Value) const -> TEnableIf_t<not TIsSame<ElementType, bool>::Value>;

回答 1 投票 0

可变参数模板和约束

我有一个可变参数模板函数,它将文件名、分隔符和非指定数量的容器作为参数作为列。然后,该函数解析并归档容器中的所有值

回答 1 投票 0

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