加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:51:15 所属栏目:百科 来源:网络整理
导读:是否可以为类成员模板特化设置不同的访问修饰符?代码示例(不编译): class SimpleClass{ public: template typename T void Method(); template void Methodchar();protected: template void Methodint();protected: template void Methodfloat();}; 子问题
>是否可以为类成员模板特化设置不同的访问修饰符?代码示例(不编译):

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不能具有默认模板参数,因为这将是不明确的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读