在C ++ Primer Plus(2001,Czech Translation)中,我发现了这些不同的模板特化语法: 函数模板 template <typename T> void foo(T); 专业化语法 void foo(int param); // 1 void foo<int>(int param); // 2 template <> void foo<int>(int param); // 3 template <> void foo(int param); // 4 template void foo(int param); // 5 使用Googlesearch一下,我发现只有3号的例子。 其中有没有什么区别(通话,编译,使用)? 他们中的一些已经过时/弃用了吗? 为什么不使用1号?
在当前标准草案的 17.6.4.2.1 / 1和17.6.4.2.1 / 2中,对用户注入namespace std专门化进行了限制。 除非另有说明,否则C ++程序的行为是未定义的,如果它将声明或定义添加到名称空间std或名称空间std中的名称空间。 只有当声明依赖于用户定义的types ,并且专业化符合原始模板的标准库要求并且没有明确禁止时,程序可以将任何标准库模板的模板专用化添加到名称空间std。 我无法find标准中用户定义types定义的词组。 我听说一个选项声称是一个不是std::is_fundamental types是一个用户定义的types ,在这种情况下, std::vector<int>将是一个用户定义的types 。 另一个答案是用户定义的types是用户定义的types 。 由于用户没有定义std::vector<int> ,而std::vector<int>不依赖于用户定义的任何types,所以std::vector<int>不是用户定义的types 。 这个影响的一个实际问题是“你可以为std::tuple<Ts…>注入一个std::hash的专门化到namespace std吗?能够这样做有点方便 – 另一种方法是创build另一个名称空间我们recursion地构build我们的std::tuple (也可能是std中没有hash支持的其他types)的hash ,当且仅当我们无法在那个名字空间中find散列时,我们才回退std 。 但是,如果这是合法的,那么如果标准为std::tuple添加了一个hash专门化到namespace std ,已经被专门化的代码将被破坏,创build一个不会在未来添加这样的专业化的理由。 虽然我正在谈论作为一个具体的例子std::vector<int> ,我想问是否std中定义的types是用户定义的types s。 第二个问题是,即使没有,也许std::tuple<int>在用户使用时变成了一个用户定义的types (这会变得很滑:如果std内的东西定义了std::tuple<int> ,那么会发生什么呢?你对std::tuple<Ts…>进行部分hash )。 目前在这个问题上有一个公开的缺陷 。
在查看std::swap的文档时,我看到了很多专业化的东西。 它看起来像每个STL容器,以及许多其他标准设施有一个专门的交换。 我想借助模板,我们不需要所有这些专业化? 例如, 如果我写我自己的pair它与模板版本正常工作: template<class T1,class T2> struct my_pair{ T1 t1; T2 t2; }; int main() { my_pair<int,char> x{1,'a'}; my_pair<int,char> y{2,'b'}; std::swap(x,y); } 那么从专门的std::pair获得什么呢? template< class T1, class T2 > void swap( pair<T1,T2>& lhs, pair<T1,T2>& rhs ); 我还想知道是否应该为自定义类写作自己的专业化, 或者仅仅依靠模板版本。
我知道语言规范禁止function模板的部分专业化。 我想知道为什么禁止它的理由? 他们没用吗? template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed!
我有一个带模板成员函数的模板类 template<class T> class A { public: template<class CT> CT function(); }; 现在我想以两种方式专门化模板成员函数。 首先是与class级具有相同的types: template<class T> template<> // Line gcc gives an error for, see below T A<T>::function<T>() { return (T)0.0; } 第二种types布尔: template<class T> template<> bool A<T>::function<bool>() { return false; } 这是我如何testing它: int main() { A<double> a; bool b = a.function<bool>(); double d = […]