簡體   English   中英

成員變量和函數參數的模板類型推導

[英]Template type deduction for member variables and function arguments

考慮以下模板類的實現:

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<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;
};

現場例子

但是,還有許多其他方法。

基於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;
}

上面的代碼按預期工作。

但是,我在函數返回類型的模板類型推導中發布了另一個相關問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM