首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板类型推导

模板类型推导
EN

Stack Overflow用户
提问于 2017-11-16 16:28:14
回答 1查看 441关注 0票数 0

我需要实现一个类,比如使用模板的'MyClass‘。

代码语言:javascript
复制
template<class T>
class MyClass
{
public:


          T var1;
          T1 var2;
        };

有两个成员变量var1和var2。如果类模板参数'T‘是基本类型(例如: float、double或long double),那么变量var1和var2的类型应该与模板参数相同。在上面的例子中,就是T1 =T。

但是如果模板参数是std::complex<T>,我希望

代码语言:javascript
复制
T var1;
std::complex<T> var2;

如何在C++11中实现?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 16:40:11

一个可能的解决方案是定义一个简单的类型特征来提取正确的类型。

代码语言:javascript
复制
template <typename T>
struct myTypeTraits
 { using type = T; };

template <typename T>
struct myTypeTraits<std::complex<T>>
 { using type = T; };

MyClass变成了

代码语言:javascript
复制
template <typename T>
class MyClass
 {
   using T0 = typename myTypeTraits<T>::type;

   T0 var1;
   T  var2;
 };

如果您想确保T是一种基本类型(或者您指的是算术?),那么要复杂一些。

一种可能的方法是定义一个类型特征来表示(truefalse),如果一个类型是std::complex

代码语言:javascript
复制
template <typename>
struct isComplex : public std::false_type
 { };

template <typename T>
struct isComplex<std::complex<T>> : public std::true_type
 { };

接下来,使用声明(没有泛型定义)和两个默认值修改

代码语言:javascript
复制
template <typename T, bool = std::is_fundamental<T>::value, 
                      bool = isComplex<T>::value>
struct myTypeTraits;

接下来的两个专业,第一个是基础,第二个是复杂类型。

代码语言:javascript
复制
template <typename T>
struct myTypeTraits<T, true, false>
 { using type = T; };

template <typename T>
struct myTypeTraits<std::complex<T>, false, true>
 { using type = T; };

MyClass类保持相等,但如果尝试用(例如) std::string实例化它,则会给出一个错误。

下面是一个完整的编译示例

代码语言:javascript
复制
#include <complex>
#include <type_traits>

template <typename>
struct isComplex : public std::false_type
 { };

template <typename T>
struct isComplex<std::complex<T>> : public std::true_type
 { };

template <typename T, bool = std::is_fundamental<T>::value, 
                      bool = isComplex<T>::value>
struct myTypeTraits;

template <typename T>
struct myTypeTraits<T, true, false>
 { using type = T; };

template <typename T>
struct myTypeTraits<std::complex<T>, false, true>
 { using type = T; };

template <typename T>
class MyClass
 {
   public:  // public to check with the static_assert()
      using T0 = typename myTypeTraits<T>::type;

   private:
      T0 var1;
      T  var2;
 };

int main ()
 {
   MyClass<int>                  mi; // compile
   MyClass<std::complex<float>>  mc; // compile
   // MyClass<std::string>          ms; // compilation error

   static_assert( std::is_same<int, decltype(mi)::T0>{}, "!" );
   static_assert( std::is_same<float, decltype(mc)::T0>{}, "!" );
 }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47334675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档