【问题标题】:Template type deduction for member variables and function arguments成员变量和函数参数的模板类型推导
【发布时间】:2017-11-17 09:06:13
【问题描述】:

考虑以下模板类的实现:

template<class T>
class MyClass
{
public:
    void setVar1(const T& v1)
    {
        var1 = v1;
    }
    void setVar2(const T1& v2)
    {
        var2 = v2;
    }

    T var1;        
    T1 var2;
};

如果模板参数T 是基本类型(如floatdoublelong double)我想要T1 = T

如果模板参数Tstd::complex&lt;float&gt;,我想要T=std::complex&lt;float&gt;T1 = floatstd::complex&lt;double&gt;std::complex&lt;long double&gt; 也是如此。

推导变量的类型在Template type derivation讨论

但是,附加的成员函数会阻止在此上下文中使用其解决方案。

【问题讨论】:

  • 如果您只是在成员函数之前添加using T1 = typename myTypeTraits&lt;T&gt;::type;,那么该解决方案应该可以工作。你发现了什么问题?
  • 一个专门针对模板-模板参数的内部(和私有)特征类似乎是一种解决方案。
  • A possible solution,我相信有更简单的方法
  • @BoPersson 感谢您的宝贵意见。在您的评论的帮助下,我已经发布了我的问题的答案。我还报告了一个与之相关的问题。你能看一下吗?
  • @BoPersson 我提到的问题现在已作为问题发布在stackoverflow.com/questions/47356284/…

标签: c++ c++11 templates template-argument-deduction


【解决方案1】:

自定义特征类就足够了。您可以利用部分专业化来选择您想要/需要的类型。示例代码

template<typename T, bool F> class Base;

template<typename T>
class Base <T, true> {
public:
  T var2;
};

template<typename T>
class Base <std::complex<T>, false> {
public:
  typename std::complex<T>::value_type var2;
};

template <typename T>
class BaseHelper : public Base<T, std::is_fundamental<T>::value> {};

template<class T>
class MyClass : public BaseHelper<T> {
public:

  using T1 = decltype(BaseHelper<T>::var2);

  void setVar1(const T& v1) {
    var1 = v1;
  }
  void setVar2(const T1& v2) {
    this->var2 = v2;
  }

  T var1;
};

Live Example

不过还有很多其他方法。

【讨论】:

    【解决方案2】:

    基于 Bo Personns 的评论和https://stackoverflow.com/questions/47334675/template-type-derivation提供的答案

    我得到了以下工作示例。

    我的.h文件内容如下。

    #include <iostream>
    #include <complex>
    #include <typeinfo>
    
    
    template <typename T>
    class MyClass
     {
    
    
     template <typename T0>
    struct myTypeTraits
     { using type = T0; };
    
    template <typename T0>
    struct myTypeTraits<std::complex<T0>>
     { using type = T0; };
    
    
    public:
    
       using T0 = typename myTypeTraits<T>::type;
    
       void setVar1(const T0& v);
    
       void setVar2(const T& v);
    
    
    T getVar2() const;
    
    
    
    
       void print() const;
    
       T0 var1;
       T  var2;
     };
    

    .cpp 文件包含以下代码行。

    template <class T>
    void MyClass<T>::setVar1(const T0& v)
    {
        var1 = v;
    }
    
    
    template <class T>
    void MyClass<T>::setVar2(const T& v)
    {
        var2 = v;
    }
    
    
    
    template <class T>
    T MyClass<T>::getVar2() const
    {
        return var2;
    }
    
    
    template <typename T>
    void MyClass<T>::print() const
    {
        std::cout<<"var1: "<<var1<<std::endl;
        std::cout<<"var2: "<<var2<<std::endl;
    
    }
    
    
    
    int main()
    {
    
        MyClass<float> tmp;
    
        MyClass<std::complex<float> > tmp1;
    
        tmp.print();
        tmp1.print();
        return 0;
    }
    

    以上代码按预期工作。

    但是,我在Template type deduction in function return type 发布了另一个相关问题

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多