成员变量和函数参数的模板类型推导

时间:2017-11-17 09:06:13

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

考虑以下模板类的实现:

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<float>,我希望T=std::complex<float>T1 = float。同样适用于std::complex<double>std::complex<long double>

Template type derivation

中讨论了推导变量的类型

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

2 个答案:

答案 0 :(得分:0)

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

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

还有很多其他方法。

答案 1 :(得分:0)

基于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

发布了另一个相关问题