假设我想写一个generics函数void f<T>() ,如果T是一个PODtypes,那么做一件事,如果T是非POD(或任何其他任意谓词),则做另一件事。 实现这一点的一种方法是使用像标准库一样的标签分派模式来处理迭代器类别: template <bool> struct podness {}; typedef podness<true> pod_tag; typedef podness<false> non_pod_tag; template <typename T> void f2(T, pod_tag) { /* POD */ } template <typename T> void f2(T, non_pod_tag) { /* non-POD */ } template <typename T> void f(T x) { // Dispatch to f2 based on tag. f2(x, podness<std::is_pod<T>::value>()); } 另一种方法是使用部分专用types的静态成员函数: […]
我知道下面的代码是一个类的部分专业化: template <typename T1, typename T2> class MyClass { … }; // partial specialization: both template parameters have same type template <typename T> class MyClass<T,T> { … }; 另外我知道C ++不允许函数模板局部特化(只允许满)。 但是,我的代码意味着我已经部分专门化我的函数模板为一个/相同types的参数? 因为它适用于Microsoft Visual Studio 2010 Express! 如果不是,那么你能否解释一下部分专业化的概念? #include <iostream> using std::cin; using std::cout; using std::endl; template <typename T1, typename T2> inline T1 max (T1 const& […]
我知道语言规范禁止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 <typename S, typename T> struct foo { void bar(); }; template <typename T> void foo <int, T>::bar() { } 给我的错误 invalid use of incomplete type 'struct foo<int, T>' declaration of 'struct foo<int, T>' (我正在使用gcc。)我的部分专业化的语法是错误的? 请注意,如果我删除第二个参数: template <typename S> struct foo { void bar(); }; template <> void foo <int>::bar() { } 那么它编译正确。
你将如何在C#专业化? 我会提出一个问题。 你有一个模板types,你不知道它是什么。 但是你知道它是否从XYZ派生出来,你想调用.alternativeFunc()。 一个好方法是调用一个特定的函数或类,并且在任何派生types的XYZ上调用.alternativeFunc()时,调用normalCall return .normalFunc()。 这将如何在C#中完成?