c – 是否可以为类成员模板特化(以及类模板成员)设置不同的访问修饰符?

c – 是否可以为类成员模板特化(以及类模板成员)设置不同的访问修饰符?,第1张

概述>是否可以为类成员模板特化设置不同的访问修饰符?代码示例(不编译): class SimpleClass{ public: template <typename T> void Method(); template <> void Method<char>();protected: template <> void Method<int>( >是否可以为类成员模板特化设置不同的访问修饰符?代码示例(不编译):

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 Clas@R_301_6563@plate{   public:    voID Method();    template <>    voID Method<char>();protected:    template <>    voID Method<int>();protected:    template <>    voID Method<float>();};

> Subquestion:是否可以为类模板的构造函数特化设置不同的访问修饰符?代码示例(不编译):

template <typename T>class Clas@R_301_6563@plate{public:    Clas@R_301_6563@plate(T);    template <>    Clas@R_301_6563@plate<char>(char);protected:    template <>    Clas@R_301_6563@plate<int>(int);private:    template <>    Clas@R_301_6563@plate<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 Clas@R_301_6563@plate{public:    Clas@R_301_6563@plate(T);    voID Method();};template <>Clas@R_301_6563@plate<char>::Clas@R_301_6563@plate(char);template <>Clas@R_301_6563@plate<int>::Clas@R_301_6563@plate(int) = delete;template <>voID Clas@R_301_6563@plate<char>::Method();template <>voID Clas@R_301_6563@plate<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 Clas@R_301_6563@plate1{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 Clas@R_301_6563@plate2{public:    template <typename U,int> = 0>    voID Method(U) { }protected:    template <typename U,int> = 0>    voID Method(U) { }};

我不知道所有这些都有用:-)无论如何:

>我一直小心地使所有构造函数/方法重载互斥,以避免使用不同访问说明符的问题和问题,这可能很棘手.这使得更难以概括为更多类型.模板别名有助于通用/默认情况(这是所有其他情况的补充).>但是,这与您在问题中描述的内容并不完全相同.这些方法强制执行严格的类型相等,因此不允许隐式转换.您可以尝试使用std :: is_convertible,但之后您会打开歧义的大门.>整个代码编译如此,但我没有尝试实际使用类,所以我不知道会发生什么.>我真的不知道如何使用SimpleClass1:我们怎么可能为默认构造函数显式指定模板参数(因为它不能推导出来)?>再次查看代码,我认为Clas@R_301_6563@plate与SimpleClass没有太大区别(或根本没有). Clas@R_301_6563@plate1不能具有默认模板参数,因为这将是不明确的.

总结

以上是内存溢出为你收集整理的c – 是否可以为类成员模板特化(以及类模板成员)设置不同的访问修饰符?全部内容,希望文章能够帮你解决c – 是否可以为类成员模板特化(以及类模板成员)设置不同的访问修饰符?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215889.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存