什么是模板<typename T, T t> 习语?

Posted

技术标签:

【中文标题】什么是模板<typename T, T t> 习语?【英文标题】:What is the template<typename T, T t> idiom? 【发布时间】:2013-04-05 17:09:58 【问题描述】:

我正在阅读this 并试图了解N3601 的内容。它说这个成语在网络搜索中出现了很多,但我找不到任何东西。什么是

template<typename T, T t>

成语,它解决了什么问题,它是如何使用的,什么是隐式模板参数,以及该提案旨在解决什么问题?

【问题讨论】:

从模板 template &lt;typename T&gt; void foo(T t); 开始。使该参数成为编译时值:template &lt;typename T, T t&gt; void bar();(我认为您的意思是,而不是 class)。现在考虑如何调用foo(5); 使T 成为int,但要使用bar,您需要bar&lt;int, 5&gt;();。这是朝着正确的方向发展吗? 我的意思是 T t,不是 T 类。修正了。 @chris 我知道你现在要去哪里了。 bar 需要在我们给它的任何类型上是通用的,但也需要与另一个模板参数相同类型的值。我们需要指定它的类型和值来推断 5 是一个 int。该提案显示了它在反射库中的用法,但直到今天我才看到它。这还能怎么用? +1。啊!我喜欢这个提议。我认为它可能帮助我解决 C++11 无法解决的 this problem。 @Nawaz,好点子。我实际上并没有想过它可以允许 C++11 不能以这种方式实现什么。 【参考方案1】:

论文介绍有误导性:成语其实是

 template <typename T, T t>

它表示一个依赖于类型T 和该类型的值t 的模板。这个符号有点重,因为在大多数情况下,类型可以从值本身推导出来。

例如

// the current definition notation
template <typename T, T t> void f()  t.f(); ;

//// the proposed definition notation
//// the parameter t depends on an implicit typename parameter T
// template <using typename T, T t> void f()  t.f(); ;

struct foo 
    void f() 
        // some computation
    
;

foo bar;

int main()
    // the current instantiation notation
    f<foo,bar>(); 
    //// the proposed instantiation notation 
    //// we know that bar is of type foo, so we don't need to specify it
    // f<bar>();

该提案是关于引入一些“语法糖”以使符号更易于编写。

此外,上面给出的示例在其描述中是微不足道的(并且可能是错误的,因为模板参数需要是constexpr),但该论文描述了当前符号可能变得非常复杂的几种情况,从而降低了可读性和整体易用性编程。

【讨论】:

并且该类型的值 t 必须是整数常量或指针,因为模板参数中不允许有任何其他内容。【参考方案2】:

正在解决的问题是从模板非类型参数推导类型。

给定:

template<typename T> void foo(T);
template<typename T, T> void bar();

可以推导出Tfoo(例如foo(10) 将导致T 推导出为int),但不可能推导出T 为@987654329 @ (bar&lt;10&gt;() 根本不会编译,你必须写成bar&lt;int,10&gt;())。

N3601 建议通过引入语法来解决此问题:

template<using typename T, T> void bar();

这将允许bar&lt;10&gt;() 编译并导致类型T 被推断出来。

【讨论】:

以上是关于什么是模板<typename T, T t> 习语?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将单个模板<typename T> 应用于多个定义/声明吗?

C++ TGP 模板基础知识--函数模板

什么是 template<> template<typename T> 语法?

第56课.函数模板的概念和意义

typename T和class T区别与联系

函数模板