templates 相关问题

模板标签用于多种上下文:通用编程(尤其是C ++),以及使用模板引擎生成数据/文档。在实现繁重的问题上使用此标记时 - 标记实现编写的代码语言。

专门针对树算法的 C++ 递归模板

我正在使用递归 C++ 模板开发一种树状算法。我设法用下面的简化算法重现我的问题。该算法采用单个整数作为输入。它计算...

回答 1 投票 0

接口和实现位于单独文件中的类模板

我有一些模板类,它们分为头文件和实现文件: // 我的模板.h 模板 类我的模板{ 民众: 无效 Foo(); }; // 我的模板.cpp #

回答 2 投票 0

具有*至少*某些参数的模板和虚函数

我知道虚函数不能模板化,但是有没有一种方法可以让派生类实现泛型函数,并且虚函数需要这样的泛型函数至少具有

回答 1 投票 0

在 HTMX 中使用 bcosca/fat-free 框架:有没有办法渲染模板片段?

我知道使用 INCLUDE 将模板分解为可以多种方式重用的片段,但这会导致许多单独的文件变得难以一致命名和管理。我...

回答 1 投票 0

从结构中提取模板类型

我有简单的标签结构 模板 结构体标签{}; 和一个班级 模板 类实现{ 民众: T func(参数...); }; 是否可以...

回答 2 投票 0

C++ 函数模板调用自身并陷入递归

代码如下: #包括 模板 结构体CTest { }; 模板 结构 CTest<__T, __Ts...>:公共 CTest<__Ts.....

回答 2 投票 0

非模板类 C++ 中的构造函数模板

我有一个非模板类(Uart),想要创建模板构造函数。它需要采用另一个模板类对象(SafeQueue)。然后这个构造函数会调用另一个模板函数def...

回答 1 投票 0

如何从模板类型别名中删除尖括号

示例: #包括 模板 结构体 X { 模板=真> 使用 MaybeInt = int; 模板 示例: #include <type_traits> template<bool condition> struct X { template<std::enable_if_t<condition, bool> = true> using MaybeInt = int; template<std::enable_if_t<condition, bool> = true> static MaybeInt<> MaybeResult() { return 0; } }; int main() { return X<true>::MaybeResult(); } 是否可以使用末尾没有空尖括号的X<true>::MaybeInt类型?如果没有,为什么? 如果我只是在第 9 行删除它们,C++17 中的 clang++ 会给出以下错误: main.cpp:9:12: error: use of alias template 'MaybeInt' requires template arguments; argument deduction not allowed in function return type static MaybeInt MaybeResult() { ^~~~~~~~ main.cpp:6:5: note: template is declared here using MaybeInt = int; ^ 1 error generated. 为什么不允许这样做? 不,在类或别名模板名称上省略模板参数列表与空模板参数列表具有不同的含义。 使用空的模板参数列表,整个事物命名一个单一类型,该类型是通过使用模板参数的所有默认模板参数获得的特化。 如果没有模板参数列表,该名称向编译器指示要执行类模板参数推导 (CTAD) 来确定模板参数。 然而,正如编译器告诉您的那样,CTAD 仅在特定上下文中允许,并且函数返回类型不是其中之一。

回答 1 投票 0

C++17 之前的 CTAD 替代品?

(或者:“如何存储不允许使用 auto 的模板参数推导函数的返回值”) 我正在开发一个由多个类模板组成的通用 C++ 框架 那个阿洛...

回答 1 投票 0

为模板化成员函数设置别名

我在类中有以下成员函数 类 cls { ... 模板 布尔函数(...){ // 根据 做一些事情 } ... } 我想改变功能...

回答 1 投票 0

重写函数模板特化中的返回类型

我想专门化一个函数模板,以便返回类型根据模板参数的类型而变化。 返回类型专业化类 { 民众: 模板 我想专门化一个函数模板,以便返回类型根据模板参数的类型而变化。 class ReturnTypeSpecialization { public: template<typename T> T Item(); }; // Normally just return the template type template<typename T> T ReturnTypeSpecialization::Item() { ... } // When a float is specified, return an int // This doesn't work: template<float> int ReturnTypeSpecialization::Item() { ... } 这可能吗?我无法使用 C++11。 由于特化必须与返回类型上的基本模板一致,因此您可以通过添加“返回类型特征”来实现这一点,这是一个可以特化并从中绘制真实返回类型的结构: // in the normal case, just the identity template<class T> struct item_return{ typedef T type; }; template<class T> typename item_return<T>::type item(); template<> struct item_return<float>{ typedef int type; }; template<> int item<float>(); 实例。 请注意,您可能想坚持以下内容,因此您只需更新 item_return 专业化中的返回类型。 template<> item_return<float>::type foo<float>(){ ... } // note: No `typename` needed, because `float` is not a dependent type 您可以像这样进行模板专业化: template<typename T> T item() { return T(); } template<> float item<float>() { return 1.0f; } 在工作类中完成所有专业化,并使用一个简单的函数作为将隐式专业化的包装器。 #include <iostream> using std::cout; // worker class -- return a reference to the given value template< typename V > struct worker { typedef V const & type; static type get( V const & v ) { return v; } }; // worker class specialization -- convert 'unsigned char' to 'int' template<> struct worker<unsigned char> { typedef int type; static type get( unsigned char const & v ) { return v; } }; // mapper function template< typename V > typename worker<V>::type mapper( V const & v ) { return worker<V>::get(v); } int main() { char a='A'; unsigned char b='B'; cout << "a=" << mapper(a) << ", b=" << mapper(b) << "\n"; } 在此示例中,unsigned char的特化导致它被转换为int,以便cout将其显示为数字而不是字符,生成以下输出... a=A, b=66 也许你可以使用以下技巧。鉴于这些简单的类型特征: template<bool b, typename T, typename U> struct conditional { typedef T type; }; template<typename T, typename U> struct conditional<false, T, U> { typedef U type; }; template<typename T, typename U> struct is_same { static const bool value = false; }; template<typename T> struct is_same<T, T> { static const bool value = true; }; 您可以编写您的类和专门的成员函数,如下所示: class ReturnTypeSpecialization { public: template<typename T> typename conditional<is_same<T, float>::value, int, T>::type Item(); }; // Normally just return the template type template<typename T> typename conditional<is_same<T, float>::value, int, T>::type ReturnTypeSpecialization::Item() { return T(); } // When a float is specified, return an int template<> int ReturnTypeSpecialization::Item<float>() { return 1.0f; } 简单测试程序(使用C++11只是为了验证): int main() { ReturnTypeSpecialization obj; static_assert(std::is_same<decltype(obj.Item<bool>()), bool>::value, "!"); static_assert(std::is_same<decltype(obj.Item<float>()), int>::value, "!"); } 这是一个实例。 您好,我尝试使用模板专门化来返回基元以及 std::string 数据的参数值,但这样做时我遇到了很多未解决的外部重新定义类型的错误。 因此,如果有人遇到这样的情况,当他/她想要返回不同的数据类型(包括字符串)时,他/她可以使用如下所示的内容, 注意:模板函数必须是头文件(*.h)的一部分... 所以我们在这里使用模板专业化字符串数据类型...... 在类内部作为内联成员,我们必须使用模板专用方法,并且在同一个文件中我们也可以定义模板。 class ConfigFileParser { public: bool ParseConfigFile(const std::string& file_name); template <typename T> T GetParameterValue(const std::string key); template <> std::string GetParameterValue<std::string>(const std::string key) { std::string param_val = ""; //do logical operation here... return param_val; } private: // private functions... // private data... }; template <typename T> T ConfigFileParser::GetParameterValue(const std::string key) { T param_val = 0; std::stringstream ss; std::string val_str; // do some operation here... ss << val_str.c_str(); ss >> param_val; return param_val; } 在 C++23 的帮助下,您可以用更少的代码来完成: #include <type_traits> template<typename T> std::type_identity_t<T> bar(); template<> std::type_identity_t<float> bar<float>() {return {}; } template<> std::type_identity_t<int> bar<int>() {return {}; }

回答 6 投票 0

C++ 模板的问题:完整指南第二版

#包括 // 任何类型的两个值的最大值(按引用调用) 模板 T const& max (T const& a, T const& b) { 返回 b < a ? a : b; } // ma...

回答 1 投票 0

具有多个参数和默认参数的类模板

我有一个这样的类模板: 结构体中继 { 整数引脚; 布尔状态; }; 模板 类 RelayArray { 私人的: 继电器阵列[N]; // 或 std::array 我有一个这样的类模板: struct Relay { int pin; bool state; }; template<std::size_t N, uint8_t D = 10> class RelayArray { private: Relay array[N]; //or std::array<Relay, N> public: RelayArray(const Relay(&ref)[N]) {} }; RelayArray myRelayArray{{{2, true}, {4, false}, {6, true}}}; 上面的声明“扩展”为RelayArray<3, 10> myRelayArray... 现在,我想提供“D”,并且仅提供“D”。应再次从声明中推导出“N”。 以下作品: RelayArray<3, 5> myRelayArray{{{2, true}, {4, false}, {6, true}}}; 但不是这使用 5 作为第一个参数,而不是 D: RelayArray<5> myRelayArray{{{2, true}, {4, false}, {6, true}}}; // does not work 在 C++17 或更早版本中,有什么方法可以让 RelayArray<5> 选择 D=5 并让 N 从初始化器中推导出来? 例如,我找到了一些带有别名的解决方案,但我对此并不满意。 谢谢 弗雷德 因为默认模板参数必须是参数列表中的最后一个,所以实际上无能为力。别名或嵌套模板。别名模板 template <std::size_t N> using RelayArray5 = RelayArray<N, 5>; 可用作嵌套类型: template <std::uint8_t D = 10> struct Def { template <std::size_t N> using Array = RelayArray<N, D>; }; Def<5>::Array myRelayArray{{{2, true}, {4, false}, {6, true}}};

回答 1 投票 0

如何制作 get_data() 函数?

我有一个内部有联合的结构。如何创建一个应该返回 bool if(value == input_value::_bool) 的 get_data() 函数。 枚举类输入值{ _布尔, _1D, _2D, _3D, };

回答 1 投票 0

数字类型的 C++ 模板

我想要一个用于选择数字类型的模板,但我也想要一个全局类型模板。我尝试应用这个问题的解决方案,但没有成功: 模板 我想要一个用于选择数字类型的模板,但我也想要一个全局类型模板。我尝试应用this问题的解决方案,但它不起作用: template<typename T, typename ... Types> void myFct(T arg1, Types ... rest) { /*do stuff*/ } template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type, typename ... Types> void myFct(T arg1, Types ... rest) { /* do stuff */ } 因为现在我有两个具有相同标头的函数。做这样的事情的正确方法是什么: template<typename T, typename ... Types> void myFct(T arg1, Types ... rest) { if (isNumeric(T)) doNumericStuff(); else doStuff(); } 可能有更好的方法来做到这一点,但对我来说最简单的方法是将 enable_if 打到返回类型上: template<typename T, typename ... Types> typename std::enable_if< std::is_arithmetic<T>::value >::type myFct(T arg1, Types ... rest) { /*do numeric stuff*/ } template<typename T, typename ... Types> typename std::enable_if< !std::is_arithmetic<T>::value >::type myFct(T arg1, Types ... rest) { /*do non-numeric stuff*/ } 一旦你有不止两个互斥的选项,这就会变得非常笨拙,但这肯定会起作用。 C++17 更新 if constexpr 丢弃未使用的分支,因此这更容易(实时链接): void myFct() { } template<typename T, typename... Ts> void myFct(T arg1, Ts... rest) { if constexpr (std::is_arithmetic<T>{}) { std::cout << "squared: " << arg1*arg1 << '\n'; } else { std::cout << "not-number\n"; } myFct(rest...); // recurse } 您可以在此处使用标签分派,并重载实现函数,因为您的“做的事情”似乎一次只涉及一个对象。 template <typename T> void do_stuff(T arg, std::true_type) { std::cout << "number\n"; } template <typename T> void do_stuff(T arg, std::false_type) { std::cout << "not-number\n"; } void myFct() { } template<typename T, typename... Ts> void myFct(T arg1, Ts... rest) { // is_arithmetic will derive either true_type or false_type do_stuff(arg1, std::is_arithmetic<T>{}); myFct(rest...); // recurse } 这是获得“静态 if”之类的典型模式 如果我用 myFct(1, std::string{}, 2.0); 调用它,我会得到输出 number not-number number

回答 2 投票 0

如何解决此错误以恢复我的旧博客?

我正在尝试恢复我的博客的旧模板,但是当我这样做时,我收到此消息:c “我们无法保存您的模板。 无法解析您的模板,因为它的格式不正确。普...

回答 3 投票 0

处理可选类成员的方法是什么?

处理大量数据(千兆字节)我使用数据数组的索引。由于访问数据可能会导致缓存效率低下,因此我想将数组中的一些数据与索引一起缓存......

回答 1 投票 0

C++ 模板的 ODR 规则有多严格?

假设我有一个复杂的项目 P,它使用库 A 和 B,并且这些库使用包含一些模板的仅标头库 T。 P --> A --> T(1.0) | ---> B --> T(1.0) 自动...

回答 1 投票 0

使用 Blazor 作为通用模板工具

我正在构建一个 C# 应用程序,用户可以在其中传递带有自定义数据的对象,然后我使用字符串格式将自定义数据插入到设置的格式中。格式化后,字符串将被发送

回答 1 投票 0

如何在 Azure DevOps 中使用 @CurrentIteration 配置任务创建模板

我创建了一个模板来在Azure DevOps板中的用户故事下生成任务。但是,在使用此模板时,我使用 @CurrentIteration 的迭代路径遇到错误。

回答 1 投票 0

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