封闭类模板参数下的嵌套模板类成员的初始化

时间:2020-01-11 22:03:06

标签: c++

如何解决这个问题?

enum SID {SID_A, SID_B};

template<SID sid>
class Emp
{
    public:
    template<typename T> struct s{T a;};

    Emp<sid>(){
        if constexpr(sid == SID_A){
            s<T>(){a = 0;} //error: use of undeclared identifier 'T'
        }
        if constexpr(sid == SID_B){
            s<T>(){a = 1;} //error: use of undeclared identifier 'T'
        }
    }
};

编译器:clang 9.0

编辑-----

我希望根据s.a的参数来实现结构成员sid的默认初始化。
T通常是intfloat

例如:

Emp<SID_A> emp_a; //here s.a = 0
Emp<SID_B> emp_b; //here s.a = 1

1 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么您希望Emp有一个数据成员s,它是一个包含数字数据成员a的结构。如果这是一个Emp<SID_A>,则该成员应该是一个初始值为0的int,而对于Emp<SID_B>来说,它应该是一个值为1.0的浮点型。我猜想您想自由地将SID类型的其他值与this->s.a的不同数字类型和值相关联。

您可以使用模板专门化来实现。在类s之前声明S的类型作为结构Emp

#include <type_traits>

enum SID {SID_A, SID_B};

template <SID> struct S;
template <> struct S<SID_A> { typedef int   Number; Number a;};
template <> struct S<SID_B> { typedef float Number; Number a;};
// You can define further specializations here

template<SID sid>
class Emp
{
  public:
    S<sid> s;

    Emp()
    {
      switch(sid)
      {
        case SID_A : s.a = 0.1; break; // Note value is 0.1 to prove it's an int
        case SID_B : s.a = 1.1; break; // Note value is 1.1 to prove it's a float
        // define further cases here
        default: ;
      }
    }
};

现在:

#include <iostream>

int main()
{
  Emp<SID_A> A;
  Emp<SID_B> B;
  std::cout << A.s.a << std::endl;
  std::cout << B.s.a << std::endl;
  return 0;
}

输出:

0
1.1
相关问题