- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有时我会看到这样的语法。
template<typename T,typename = int>
int foo(){
//...
}
什么部分 typename = int
是什么意思?可以用在什么地方?
最佳答案
foo
有两个模板参数。第一个叫做 T
第二个未命名,默认为 int
.
仅在您的代码段中,没有理由使用第二个参数。 SFINAE 经常会出现未命名的模板参数。来自 cppreference 的示例:
// primary template handles non-referenceable types:
template<class T, class = void>
struct reference_traits {
using add_lref = T;
using add_rref = T;
};
// specialization recognizes referenceable types:
template<class T>
struct reference_traits<T, std::void_t<T&>> {
using add_lref = T&;
using add_rref = T&&;
};
template<class T>
using add_lvalue_reference_t = typename reference_traits<T>::add_lref;
template<class T>
using add_rvalue_reference_t = typename reference_traits<T>::add_rref;
主模板有第二个参数的唯一原因是它可以被专门化。在可能的情况下,实例化更专业的特化。如果此操作失败(因为 T&
无效),则“替换失败不是错误”(SFINAE) 将启动并实例化主模板。
未命名参数的一个更简单的例子是当你想要一个模板参数只是作为一个标签来区分不同的实例化:
template<typename = int>
struct bar {
// ...
};
即使执行bar
不依赖于您可能想要的模板参数 bar<double>
和 bar<std::string>
是两种不同的类型。
关于c++ - 这个模板语法 "typename = T"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65491395/
我试图任意“绑定(bind)”模板参数,但遇到了一个优雅问题。 直接切入根本问题,gcc 6.2 有以下问题,但逻辑上我认为没有问题...... template P, typename A, typ
我想知道为什么类特化来自 template至 template不支持。 例如: template struct B{}; template struct B{}; //ok template str
我希望以下代码在 foo 从 base 派生任何东西时编译,否则会出现编译错误。我已经编写了类型特征类 is_Base,因为 std::is_base_of 不能很好地与我的模板内容一起使用。我很接近
最近我偶然发现了这样一段代码: template template void SomeClass::Function() {} 有模板函数,但它有奇怪的语法,我不太明白。它有什么作用?附近有没有t
我有一个 vector : std::vector> m_connections 然后我想声明一个由共享指针组成的 vector ,指向与该 vector 以通用方式由弱指针持有的相同类型: std:
探索时this answer我发现采用参数包的模板不会被期望具有特定数量参数的模板的模板接受。 在我看来,这是一个缺陷,因为如果一个模板可以接受任意数量的参数,它应该能够映射到一个特定的数字。有语言律
我需要为我的类获取 2 个类型参数:T1,它是一个具有模板的类,以及 T2,它是 T1 模板的参数。 在我的例子中,一个顶点类型(有 2 个,一个从另一个继承),以及顶点存储的数据类型(在我的例子中是
有时我发现自己需要以下东西: template struct choose{ typedef T1 type; }; template struct choose{ typedef T2 ty
对我来说,编译器可以推导出这样的模板类型看起来很自然: template struct wrap { std::function func_; template wrap(Ar
我对嵌套模板及其模板特化有疑问。给定以下类: 一个小模板类 template class T { public: T(){} virtual ~T (){} }; 还有一些嵌套模板 t
我正在从事一个使用 VS 2008 中内置的测试工具的项目。 我会定期看到类似于以下内容的错误:“AcademyPro.Code.BLL.Appearance”类型的值无法转换为“AcademyPro
代码如下: namespace o { template struct Alias; template inline std::ostream &operator &inst); template
根据文档(https://en.cppreference.com/w/cpp/utility/move),std::move有两种构造函数,在下面发布。 这些构造函数之间有什么区别? 最让我困惑的是,
我有三个 View (AddMatchView、TeamPickerView 和 TeamsOfCountryView)。一切都应该像这样工作:从 AddTeamView 我转到 TeamPicker
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我试图通过想象神秘的构造来更全面地掌握模板语法和语义。我认为 C++11 标准不允许使用以下语法: template class A {...}; // phony "specialization"
我非常惊讶地发现,当依赖类型作为基类出现时,没有必要添加 typename: struct B {}; struct wr { typedef B type; }; template struct A
我一直在阅读有关删除类型引用的内容,here . 它给出了以下示例: #include // std::cout #include // std::is_same template void pr
一段时间以来,我一直在尝试使用模板,但我做的越多,我意识到我理解的就越少。这个最新的问题感觉就像是我发现了一个相当根本的误解,我开始比以往任何时候都想得更多,“好吧,明天我不应该写任何代码,而是找一个
以下是代码,引用自 Addison Wesley 的 C++ 模板: template class MyClass { typename T::SubType * ptr;
我是一名优秀的程序员,十分优秀!