C++ 这是“的论点”;使用;要创建已建立的类型别名?
C++11中有一种新语法,用于创建类型别名,C++ 这是“的论点”;使用;要创建已建立的类型别名?,c++,templates,alias,typedef,language-design,C++,Templates,Alias,Typedef,Language Design,C++11中有一种新语法,用于创建类型别名,使用。它可以在使用typedef的地方使用,并且可以模板化。支持使用的方法如下: 有人建议(重新)使用关键字typedef-如 论文[4]-介绍模板别名: template<class T> typedef std::vector<T,MyAllocator<T>> Vec; 可以理解为:从现在起,我将使用Vect作为std::vector的同义词。有了这样的解读,别名的新语法似乎合乎逻辑 然而,我不明白。我们对类
使用
。它可以在使用typedef
的地方使用,并且可以模板化。支持使用的方法如下:
有人建议(重新)使用关键字typedef-如
论文[4]-介绍模板别名:
template<class T>
typedef std::vector<T,MyAllocator<T>> Vec;
可以理解为:从现在起,我将使用Vect
作为std::vector
的同义词。有了这样的解读,别名的新语法似乎合乎逻辑
然而,我不明白。我们对类和函数使用模板,并且没有单独的关键字。那么为什么我们对typedef
有一个单独的关键字呢
即:
class-Foo{
};
模板
分类栏{
};
我们对Foo
和Bar
都使用class
,Foo
是一个实际的类,而Bar
是一个模板,是类的“集合”
有人能解释一下吗?除了(IMO)更大的可读性参数之外,别名模板不仅仅是别名(就像typedef一样,您无法以任何方式区分typedef和它们的别名类型):它们真正代表了一系列类型,例如,您可以编写:
template<class T>
using foo = ...;
template<template<typename> class TT> void bar();
bar<foo>();
模板
使用foo=。。。;
模板空白条();
bar();
所以富不仅仅是一个别名,它是一个不同的野兽;使用typedef可能会让人困惑。。。我认为这就是“Vec不是一个类型的别名,不应该被视为一个typedef名称”的意思。我觉得它是基于大量的观点。可能没有令人满意的答案。首先,
使用
语法感觉更自然(至少对某些人来说)。但除此之外,我不知道。也许有人有足够的内部信息来提供技术推理。。。或者确认没有。是的,除非有具体的技术理由反对,答案只会是‘因为委员会这么说’<代码>使用在语法上更加一致:这样,您总是编写模板[category:class | using | function | etc.][identifier][definition]
您链接的线程中的解释是什么?现在你的问题对我来说似乎是多余的(这并不是故意的侮辱,只是我看不出这里有什么不同,所以请帮帮我:-)@下划线\d该模式不适用于函数。您没有编写模板函数foo=t(tx){return x+1;}
,所以我不明白为什么不能以同样的方式将其扩展到typedef
。@AndyG:请再次阅读我的问题。我不是在问使用背后的原因。并询问对其的解释,它是否已经确立。链接的答案中没有写这方面的内容。为什么会让人困惑?为什么对类型和模板都使用class
?同样的原则。他们可以像赫伯建议的那样添加模板化的typedef。模板化的typedef(如果他们选择了这种方式…)有什么让人困惑的地方,这并不让abot模板化的类感到困惑?@geza,这不是相同的原理;类声明一个新类型,template类声明一个新的类型族VS typename声明一个类型别名,templateusing声明一个新的类型别名族;如上所述,typedef只引入了一个新名称,templateusing引入了一个新实体hmmclass
声明一个新类型,template class
声明一个新的类型族VStypedef
声明一个类型别名,template typedef
声明一个新的类型别名族。对我来说,这似乎是相同的原则(如果这是现实的话)。foo
不仅仅是一个别名,但理论上我们可以制作模板类型定义。。。foo2代码>通过使foo2
仅为别名而有效;i、 e.bar
在此实施下无效。这类似于Haskell中的参数化type
。@geza,换句话说,给定templatetypedef和通常的typedef语义,您是否希望编译上面的bar()调用?
class Foo {
};
template <typename>
class Bar {
};
template<class T>
using foo = ...;
template<template<typename> class TT> void bar();
bar<foo>();