Questions tagged «templates»

template标记用于多种环境:通用编程(尤其是C ++),以及使用模板引擎生成数据/文档。在实现上有很多疑问时使用此标记-标记实现所使用的代码语言。

1
void_t“可以实现概念”吗?
我正在观看Walter Brown在CppCon2014上有关模板元编程的第二部分,在此期间他讨论了他的新颖void_t<>结构的用法。彼得·索默拉德(Peter Sommerlad)在演讲中问了我一个不太明白的问题。(链接直接指向问题,正在讨论的代码是在此之前直接进行的) 索默拉德问 沃尔特,这是否意味着我们实际上可以立即实施精简概念? 沃尔特回应 哦耶!我已经完成了...它没有完全相同的语法。 我了解这次交流是关于Concepts Lite。这种模式真的那么通用吗?无论出于什么原因,我都没有看到它。有人可以解释(或素描)这样的样子吗?这仅仅是关于enable_if和定义特征,还是提问者指的是什么? 该void_t模板定义如下: template<class ...> using void_t = void; 然后,他使用它来检测类型语句是否格式正确,并使用它来实现is_copy_assignable类型特征: //helper type template<class T> using copy_assignment_t = decltype(declval<T&>() = declval<T const&>()); //base case template template<class T, class=void> struct is_copy_assignable : std::false_type {}; //SFINAE version only for types where copy_assignment_t<T> is well-formed. template<class T> …

6
在CodeIgniter的视图中包括视图的最佳方法
我正在启动一个大型代码点火器项目,并想尝试为内容片段(如可能在不同页面/控制器上显示的数据循环)创建一些可重用的“迷你”视图。 从主控制器的视图中调用视图更好吗?如果是这样,怎么办?还是应该从控制器调用“迷你视图”,然后将视图的代码传递给主视图?

8
在Ajax调用之后使用Django模板呈现JSON对象
我一直在尝试了解在Django中执行Ajax的最佳方法是什么。通过四处阅读,我了解到常见的过程是: 使用一些JavaScript库(例如jQuery)来制定您的Ajax调用,在Django中设置URL模式以捕获该调用并将其传递给视图函数 在Python视图函数中,检索您感兴趣的对象并将其以JSON格式或类似格式发送回客户端(通过使用内置的序列化器模块或simplejson) 在JavaScript中定义一个回调函数,该函数接收JSON数据并进行解析,以便创建需要显示的HTML。最后,JavaScript脚本将HTML放置在应保留的位置。 现在,我仍然不明白的是Django模板如何与所有这些相关?显然,我们根本没有利用模板的功能。理想情况下,我认为最好传回JSON对象和模板名称,以便可以迭代数据并创建HTML块。但是也许我在这里完全错了... 我发现朝这个方向发展的唯一资源是此代码段(769)但我还没有尝试过。显然,在这种情况下将要发生的所有结果HTML都是在服务器端创建的,然后传递给客户端。JavaScript回调函数只需要在正确的位置显示它。 这会导致性能问题吗?如果没有,即使不使用上面的代码段,为什么不使用Python而不是前端直接在后端格式化HTML? 非常感谢! 更新:请使用代码片段942,因为它是上述代码的增强版本!我发现继承支持通过这种方式效果更好。

7
将'typedef'从基础类传播到'模板'的派生类
我试图定义只包含typedef的基类。 template<typename T> class A { public: typedef std::vector<T> Vec_t; }; template<typename T> class B : public A<T> { private: Vec_t v; // fails - Vec_t is not recognized }; 为什么在BI中收到无法识别Vec_t的错误,我需要显式地编写它? typename A<T>::Vec_t v;

3
如何在编译时获取多维std :: vector的深度?
我有一个函数,需要一个多维参数std::vector,需要将深度(或维数)作为模板参数传递。与其对这个值​​进行硬编码,我想编写一个constexpr函数,该函数将std::vector并将深度作为unsigned integer值返回。 例如: std::vector<std::vector<std::vector<int>>> v = { { { 0, 1}, { 2, 3 } }, { { 4, 5}, { 6, 7 } }, }; // Returns 3 size_t depth = GetDepth(v); 不过,这需要在编译时完成,因为此深度将作为模板参数传递给模板函数: // Same as calling foo<3>(v); foo<GetDepth(v)>(v); 有什么办法吗?

2
为什么remove_reference在函数上不起作用?
前几天进行一些模板元编程时遇到了奇怪的事情。基本上可以归结为这个断言没有(正如我期望的那样)通过。 static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); 起初我以为我在定义函数引用时犯了语法错误,但是这个断言通过了,表明事实并非如此。 static_assert(std::is_same_v<void()&, void()&>); 我还尝试实现remove_reference自己从cppreference复制源,但这也不起作用。这里发生了什么?
38 c++  templates  types  c++17 

4
模板元编程
有人可以向我解释一下,为什么第一个模板元编程方式将进入无限循环,而第二个模板正确运行。 #include <iostream> using namespace std; template<int N, int M> struct commondivs { static const int val = (N<M) ? commondivs<N,(M-N)>::val : commondivs<(N-M),M>::val; }; template<int N> struct commondivs<N,N> { static const int val = N; }; int commondiv(int N, int M){ if(N==M){ return N; } return (N<M)?commondiv(N,(M-N)):commondiv((N-M),M); } int main() …

4
使用模板重载功能
我正在尝试使用模板定义函数,并且我希望类型名是int或anEnum(我已定义的特定枚举)。我尝试了以下操作,但失败了: template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T> bool isFunction(const T &aVariable){} 我正在尝试使用模板,而不是定义两个重载函数。我希望函数可以按以下方式调用,而程序员不必考虑类型 isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable) 基本上,我希望将此函数作为int和aNum类型的模板。我已经搜索过了,但是找不到答案。我可能会缺少什么?谢谢,

3
如何在C ++中创建类型列表的笛卡尔乘积方法?
自我解释。 基本上说我有这样的类型列表: using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; 它们可以是各种类型的类型列表。 如何获得笛卡尔积的类型列表? result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, double>, type_list<somestructA, somestructB, short> >; 我确实涉足如何创建如下所示的双向笛卡尔乘积:如何创建类型列表的笛卡尔乘积?,但n方法似乎并不那么琐碎。 现在我正在尝试... template <typename...> struct type_list{}; // To concatenate template <typename... Ts, typename... Us> constexpr auto …

4
具有特定类型作为通用参数的STL容器
有什么办法可以使函数将具有特定类型(让我们说std::string)的容器作为参数? void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } 并为每种类型的stl容器调用它作为输入?喜欢上面吗? std::set<std::string> strset; std::vector<std::string> strvec; std::list<std::string> strlist; foo(strset); foo(strvec); foo(strlist);

1
'auto'作为函数参数的模板参数占位符
C ++ 20允许使用auto函数参数类型。 它是否还允许将函数参数类型auto用作模板参数占位符(不相似,但以C ++ 17 template <auto>的精神)。 因此,以下代码是C ++ 20之前的版本: template<typename First, typename Second> void printPair(const std::pair<First, Second>& p) { std::cout << p.first << ", " << p.second; } 可以写成: void printPair(const std::pair<auto, auto>& p) { std::cout << p.first << ", " << p.second; } 它确实可以编译,并且可以很好地与实验性GCC实现概念配合使用。 它是C ++ 20的合法语法吗?
22 c++  templates  auto  c++20 

4
如何调用模板类型的正确构造函数?
在以下代码中,如何使注释行与其上方的行一样工作? 我想将其设为通用代码,以调用合适的template构造函数Type。 #include <string> #include <iostream> template <typename Type> struct Class { Type data; Class(Type data) : data(data) { } }; int main() { Class<std::string> a = std::string("abc"); // Class<std::string> b = "abc"; std::cout << a.data << std::endl; return 0; }



4
为什么std :: function不参与重载解析?
我知道以下代码不会编译。 void baz(int i) { } void baz() { } class Bar { std::function<void()> bazFn; public: Bar(std::function<void()> fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } std::function正如我在另一篇文章中所读到的,因为据说不考虑重载解决方案。 我不完全理解强制这种解决方案的技术局限性。 我阅读了有关cppreference 的翻译和模板的阶段,但是我无法想到找不到反例的任何理由。向半熟练的人解释(对于C ++来说仍然是新手),什么以及在什么翻译阶段使以上内容无法编译?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.