模板参数中的C ++部分模板特化和类继承

时间:2016-02-02 11:21:02

标签: c++ templates

虽然这里有几个类似主题的问题,但我没有让我的代码工作。我有以下课程:

template<class T, class DataGetter>
class LogableTemplate
{
  public:
    //logs data got by dataGetter
    static DataGetter dataGetter;
};
template<class T, class DataGetter> 
DataGetter LogableTemplate<T, DataGetter>::dataGetter;

template<class T, class DataGetter>
class Logable : public LogableTemplate<T, DataGetter>
{
};

我像这样使用这个类:

class ADataGetter;
class A : public Logable<A, ADataGetter> {}
class ADataGetter {  //generic external functor returning some data
  public:
    int operator()(const A&a) { return 3; }
};

但是有一种特殊情况,当我有一些类将其他类转换为所需类型时,例如:

template <class T>
class IntClassMapper {
  public:
    int mapToInt(const T &t);    
};

没关系,但它没有必要的operator()。我做了辅助课:

template<class T, class Mapper>
class IntMapperDataGetter {
  public:
    int operator()(const T &t) {
      return mapper.mapToInt(t);
    }
  static Mapper mapper;
};
template<class T, class Mapper>
Mapper IntMapperDataGetter<T, Mapper>::mapper;

对于Logable的第二个模板参数从IntClassMapper继承的情况,我不需要部分特化。我试过跟随代码(和几百个相似的代码),但我总是得到一些编译错误 - 通常:

error: template parameters not deducible in partial specialization

以下是代码:

template<class T, class Mapper>
class Logable<T, typename std::enable_if<std::is_base_of<IntClassMapper<T>, Mapper>::value, IntMapperDataGetter<T, Mapper>>::type> : public LogableTemplate<T, IntMapperDataGetter<T, Mapper>>
{
};

您可以在https://ideone.com/qz9jIt

上查看和测试代码

有可能这样做吗? 谢谢你,马丁

1 个答案:

答案 0 :(得分:0)

据我所知,您希望Logger根据模板参数的属性具有不同的行为。这样的事可能会有所帮助吗?

template
<
  class T, 
  class DataGetter, 
  bool enable = std::is_base_of<QVariantClassMapper<T>, DataGetter>::value
>
class Logable 
  : public LogableTemplate<T, DataGetter>
{
};

template<
  class T, 
  class Mapper
>
class Logable<T, Mapper, true> 
  : public LogableTemplate<T, QVariantMapperDataGetter<T, Mapper> >
{
};