【问题标题】:How to create template dependent member type如何创建模板依赖成员类型
【发布时间】:2013-05-17 23:09:30
【问题描述】:

我正在尝试减少和简化一些可怕的嵌套和过度专用的模板化 C++ 代码。为此,我希望能够声明依赖于函数或类已实例化的模板类型的成员类型。

将以下通用类模板作为生成的模板特化。 'a' 的类型取决于实例化类型。

  template <typename Float> class A;

  template <>
    class A<double> {  
      double a;
    }
  };

  template <>
    class A<float> {  
      float a;
    }
  };


  template <>
    class A<short> {  
      float a;
    }
  };

除了 'a' 的类型、模板类型到类型的映射是 double->double、float->float 和 short->float 之外,这些类是相同的。有没有办法简单地封装这个映射,只允许编写一次类?

我想我想写一些类似下面的东西,但我不知道这是否可能。

  typedef double Float2<double>;
  typedef float Float2<float>;
  typedef float Float2<short>;

  template <typename Float>
    class A {  
      Float2<Float> a;
    }
  };

请注意,我使用的是 C++03,不能为此使用 C++11(我认为 decltype 可能在这里有用,但我不确定)。

【问题讨论】:

    标签: c++ templates c++03


    【解决方案1】:

    没有必要使用decltype。您可以创建一个类型特征并对其进行专门化以提供适当的类型映射:

    template<typename>
    struct mapper;
    
    template<>
    struct mapper<double> {
        typedef double type;
    };
    
    template<>
    struct mapper<float> {
        typedef float type;
    };
    
    template<>
    struct mapper<short> {
        typedef float type;
    };
    
    template <typename Float> 
    class A {
        typedef typename mapper<Float>::type float_type;
    
        float_type a;
    };
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2018-12-24
    相关资源
    最近更新 更多