c – 是否可以为类成员模板特化(以及类模板成员)设置不同的访问
>是否可以为类成员模板特化设置不同的访问修饰符?代码示例(不编译):
class SimpleClass { public: template <typename T> void Method(); template <> void Method<char>(); protected: template <> void Method<int>(); protected: template <> void Method<float>(); }; >子问题:是否可以为类的模板构造函数特化设置不同的访问修饰符?代码示例(不编译): class SimpleClass { public: template <typename T> SimpleClass(T); template <> SimpleClass<char>(char); protected: template <> SimpleClass<int>(int); private: template <> SimpleClass<float>(float); }; >是否可以为类模板成员特化设置不同的访问修饰符?代码示例(不编译): template <typename T> class ClassTemplate { public: void Method(); template <> void Method<char>(); protected: template <> void Method<int>(); protected: template <> void Method<float>(); }; > Subquestion:是否可以为类模板的构造函数特化设置不同的访问修饰符?代码示例(不编译): template <typename T> class ClassTemplate { public: ClassTemplate(T); template <> ClassTemplate<char>(char); protected: template <> ClassTemplate<int>(int); private: template <> ClassTemplate<float>(float); }; 更具体一点:1)我正在为这样的C 11代码寻找C 03解决方法: class SimpleClass { public: template <typename T> SimpleClass(T); template <typename T> void Method(); }; template <> SimpleClass::SimpleClass<char>(char); template <> SimpleClass::SimpleClass<int>(int) = delete; template <> void SimpleClass::Method<char>(); template <> void SimpleClass::Method<int>() = delete; 在2)我正在寻找以下C 11代码的C 03解决方法: template <typename T> class ClassTemplate { public: ClassTemplate(T); void Method(); }; template <> ClassTemplate<char>::ClassTemplate(char); template <> ClassTemplate<int>::ClassTemplate(int) = delete; template <> void ClassTemplate<char>::Method(); template <> void ClassTemplate<int>::Method() = delete; 解决方法
经过一些讨论,这里是所有案例的完整说明,包括使用我的
previous answer方法的不同访问说明符.
template <bool C,typename T = void> using only_if = typename std::enable_if <C,T>::type; template <typename A,typename B> using eq = typename std::is_same <A,B>::type; class SimpleClass1 { public: template <typename T,only_if <!eq <T,int>{} && !eq <T,float>{},int> = 0> SimpleClass1() { } protected: template <typename T,only_if <eq <T,int>{},int> = 0> SimpleClass1() { } }; class SimpleClass2 { public: template <typename T,int> = 0> SimpleClass2(T) { } protected: template <typename T,int> = 0> SimpleClass2(T) { } private: template <typename T,int> = 0> SimpleClass2(T) { } }; template <typename T> class ClassTemplate1 { public: template <typename U,only_if <!eq <U,int>{} && !eq <U,int> = 0> void Method() { } protected: template <typename U,only_if <eq <U,int> = 0> void Method() { } }; template <typename T> class ClassTemplate2 { public: template <typename U,int> = 0> void Method(U) { } protected: template <typename U,int> = 0> void Method(U) { } }; 我不知道所有这些都有用:-)无论如何: >我一直小心地使所有构造函数/方法重载互斥,以避免使用不同访问说明符的问题和问题,这可能很棘手.这使得更难以概括为更多类型.模板别名有助于通用/默认情况(这是所有其他情况的补充).>但是,这与您在问题中描述的内容并不完全相同.这些方法强制执行严格的类型相等,因此不允许隐式转换.您可以尝试使用std :: is_convertible,但之后您会打开歧义的大门.>整个代码编译如此,但我没有尝试实际使用类,所以我不知道会发生什么.>我真的不知道如何使用SimpleClass1:我们怎么可能为默认构造函数显式指定模板参数(因为它不能推导出来)?>再次查看代码,我认为ClassTemplate与SimpleClass没有太大区别(或根本没有). ClassTemplate1不能具有默认模板参数,因为这将是不明确的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |