什么是模板<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 <typename T> void foo(T t);
开始。使该参数成为编译时值:template <typename T, T t> void bar();
(我认为您的意思是,而不是 class
)。现在考虑如何调用foo(5);
使T 成为int
,但要使用bar
,您需要bar<int, 5>();
。这是朝着正确的方向发展吗?
我的意思是 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();
可以推导出T
为foo
(例如foo(10)
将导致T
推导出为int
),但不可能推导出T
为@987654329 @ (bar<10>()
根本不会编译,你必须写成bar<int,10>()
)。
N3601 建议通过引入语法来解决此问题:
template<using typename T, T> void bar();
这将允许bar<10>()
编译并导致类型T
被推断出来。
【讨论】:
以上是关于什么是模板<typename T, T t> 习语?的主要内容,如果未能解决你的问题,请参考以下文章
我可以将单个模板<typename T> 应用于多个定义/声明吗?