首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >图中模板元编程的例子?

图中模板元编程的例子?
EN

Stack Overflow用户
提问于 2015-03-28 21:39:57
回答 2查看 3.4K关注 0票数 7

有什么例子可以说明模板元编程比新的模式更适合使用吗?据我所理解,无论是constexpr还是模板元编程都有类似的目的,但是模板元编程并没有过时。因此,必须有一些例子,其中模板元编程是优先于constexpr的。对此有任何共同的想法将是非常感谢的,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-28 21:48:54

constexpr以真正的C++函数的形式为编译时计算提供真正的支持,而不是基于功能的基于模板的构造(元功能)。因此,部分的答案是yes constexpr在编译时计算上击败了tmp ,至少在语法上没有fp启动的人习惯于C++。请注意,我忽略了对编译器性能等的关注。

另一方面,tmp仍然相关,实际上也是在C++中进行类型计算的唯一方法。有一些新的方法可以改进可怕的tmp语法,比如Boost.Hana如何处理模板变量。但尽管语法,仍是一种功能元语言,与“正常”C++分离。

关于类型计算

从您可能要求C++编译器执行的两个常见任务中(除了编译),根据您的需求按需生成新类型的类型系统是无法实现的,仅仅因为这不是compiler应该/设计要做的。

有趣的是,模板不应该做编译时计算。甚至是元编程。它们被设计为通用编程的C++特性。但你知道的故事,90年代中期“哇,C++模板是图灵完成!”,表达式模板和blitz++之后,然后亚历山德雷苏和他的洛基。现在我们有了<type_traits>和一个严肃的https://github.com/ericniebler/meta提案。

考虑这个示例(不是我的,摘自这个Eric “挑战”):编写一个实用程序,为您提供一组类型之间的公共类型:

代码语言:javascript
运行
复制
namespace m = ranges::meta; 
namespace ml = ranges::meta::lazy; 

template<typename T, typename U> 
using builtin_common_t = 
    decltype(true? std::declval<T>() : std::declval<U>()); 
template<typename T, typename U> 
using lazy_builtin_common_t = 
    m::defer<builtin_common_t, T, U>; 

template<typename...Ts> 
struct common_type 
{}; 

template<typename ...Ts> 
using common_type_t = m::eval<common_type<Ts...>>; 

template<typename T> 
struct common_type<T> 
  : std::decay<T> 
{}; 

template<typename T, typename U> 
struct common_type<T, U> 
  : m::if_c< 
        ( std::is_same<decay_t<T>, T>::value && 
          std::is_same<decay_t<U>, U>::value ), 
        ml::let<lazy_builtin_common_t<T, U>>, 
        common_type<decay_t<T>, decay_t<U>>> 
{}; 

template<typename T, typename U, typename... Vs> 
struct common_type<T, U, Vs...> 
  : ml::let<ml::fold<m::list<U, Vs...>, T, m::quote<common_type_t>>> 
{}; 

正如您所看到的,这个问题与类型有关。这是警员不该做的事。

关于这一挑战,Eric要求Louis (Boost.Hana作者)和我使用我们的库编写common_type<Ts...>。上面的代码是Eric使用他的元库实现的。真诚地说,我无法战胜路易的折叠+也许是单一的解决方案:)

票数 10
EN

Stack Overflow用户

发布于 2015-03-28 21:52:12

实际上,任何时候您都希望创建一组相关类型,这些类型仅在其中使用的某些类型中有所不同。如何仅用std::vector<T>实现constexpr

模板和constexpr执行不同的任务,尽管constexpr。然而,这些案例并不是详尽无遗的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29322938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档