如何将类的某个typedef传递给模板

时间:2018-01-24 18:02:30

标签: c++ templates instantiation

在以下任务中,我想创建一个模板,该模板只接受以下类CDataFormat中定义的typedef:

class CDataFormat{
public:
    typedef unsigned short  element_t;
    typedef unsigned int accumulation_t;
    typedef double division_t;
}; 

现在以下实施工作正常。

template<typename DF, int SIZE>
class CFilter{
private:
    DF m_memberName[SIZE];
public: 
    void whatever(){
    //CFilter<CDataFormat::division_t, 8> smth; // Just a small test
    }
};

但是,不能确保模板只接受CDataFormat的成员。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用static_assert举报错误行为:

template <typename DF, int SIZE>
class CFilter{
static_assert(std::is_same<CDataFormat::element_t, DF>::value
           || std::is_same<CDataFormat::accumulation_t, DF>::value
           || std::is_same<CDataFormat::division_t, DF>::value, "Unexpected type");

private:
    DF m_memberName[SIZE];
};

答案 1 :(得分:1)

您可以使用帮助程序类和static_assert来满足您的需求。

#include <type_traits>

class CDataFormat{
public:
    typedef unsigned short  element_t;
    typedef unsigned int accumulation_t;
    typedef double division_t;

}; 

template <typename T> struct is_valid_type
{
   static const bool value = std::is_same<T, CDataFormat::element_t>::value ||
                             std::is_same<T, CDataFormat::accumulation_t>::value ||
                             std::is_same<T, CDataFormat::division_t>::value ;
};

template<typename DF, int SIZE>
class CFilter{
  static_assert(is_valid_type<DF>::value, "Unsupported type");
  private:
    DF m_memberName[SIZE];
  public: 
    void whatever(){
    }
};

有了这个,

CFilter<CDataFormat::element_t, 10> f1;

除了使用

外,没有任何问题
CFilter<int, 20> f2;

将导致编译时错误。