簡體   English   中英

模板類的C ++分解模板方法的特化方法,這可能嗎?

[英]C++ factoring tempate methods specialization of a template class, is that possible?

我在模板類中有一個模板方法。
我讀到沒有專門的類就無法專門的方法。
但是我想分解其中一些方法,這可能嗎?

范例:

class One {
public:
  static const int number = 1;
};

class Two {
public:
  static const int number = 2;
};    

template<typename num> class A  {
private:
  num n;

public:
  template<typename type>
  void multiplyBy(); // by 1 if <int> or 1,5 if <float>
}; // A

template<> template<> void A<One>::multiplyBy<int>() {
  std::cout << 1.0*n.number << std::endl;
}

template<> template<> void A<One>::multiplyBy<float>() {
  std::cout << 1.5*n.number << std::endl;
}

template<> template<> void A<Two>::multiplyBy<int>() {
  std::cout << 1.0*n.number << std::endl;
}

template<> template<> void A<Two>::multiplyBy<float>() {
  std::cout << 1.5*n.number << std::endl;
}

int main() {
  A<One> aOne;
  A<Two> aTwo;
  aOne.multiplyBy<int>();   // 1
  aOne.multiplyBy<float>(); // 1.5
  aTwo.multiplyBy<int>();   // 2
  aTwo.multiplyBy<float>(); // 3

  return 0;
}

一個與stackoverflow相關的問題: 模板類內部的模板函數的C ++專業化
特別是這樣的注釋: 模板類內部的模板函數的C ++專業化

我要扣除的是沒有方法可以乘以multiBy() ,因為一個用於int ,另一個用於float
由於英語不是我的自然語言,也許我想念一些簡單的東西,也許是部分專業化的解決方法。

編輯:將A :: n私下匹配以更好地解決我的問題。

您可以使用標簽分派:

#include <iostream>

class One {
public:
  static const int number = 1;
};

class Two {
public:
  static const int number = 2;
};

template<typename num>
class A  {
    public:
    num n;

    private:
    template<typename> struct Tag {};

    void multiplyBy(Tag<int>) {
        std::cout << 1.0*n.number << std::endl;
    }

    void multiplyBy(Tag<float>) {
        std::cout << 1.5*n.number << std::endl;
    }

    public:
    template<typename type>
    void multiplyBy() {
        multiplyBy(Tag<type>());
    }
};


int main() {
  A<One> aOne;
  A<Two> aTwo;
  aOne.multiplyBy<int>();   // 1
  aOne.multiplyBy<float>(); // 1.5
  aTwo.multiplyBy<int>();   // 2
  aTwo.multiplyBy<float>(); // 3

  return 0;
}

但是我想分解其中一些方法,這可能嗎?

您可能知道您不能使用:

template<> template<> void A<One>::multiplyBy<int>() {
  std::cout << 1.0*n.number << std::endl;
}

無需專門A<One>

您可以按照以下方式進行操作:

#include <iostream>

class One {
public:
  static const int number = 1;
};

class Two {
public:
  static const int number = 2;
};    

template<typename num, typename type = int> struct MultiplyBy {
   static void doit(num n)
   {
      std::cout << 1.0*n.number << std::endl;
   }
};

template<typename num> struct MultiplyBy<num, float> {
   static void doit(num n)
   {
      std::cout << 1.5*n.number << std::endl;
   }
};

template<typename num> class A  {
public:
  num n;

  template<typename type>
  void multiplyBy()
  {
     MultiplyBy<num, type>::doit(n);
  }
};


int main() {
  A<One> aOne;
  A<Two> aTwo;
  aOne.multiplyBy<int>();   // 1
  aOne.multiplyBy<float>(); // 1.5
  aTwo.multiplyBy<int>();   // 2
  aTwo.multiplyBy<float>(); // 3

  return 0;
}

暫無
暫無

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

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