簡體   English   中英

“模板化”命名空間

[英]“templating” a namespace

我想建立這樣的東西:

File 1:
template<typename Vector>
namespace myNamespace {
  class myClass1{ myClass1(Vector v) {...} }
}

File 2:
template<typename Vector>
namespace myNamespace {
  class myClass2{ myClass2(Vector v) {...} }
}

當然這是不可能的,因為你不能模板命名空間。 相反,我可以使用結構而不是命名空間,但是我不能將命名空間函數擴展到幾個文件。

有這樣一個問題的解決方案嗎?

PS:我知道我可以模擬類,但是我必須在創建新類時指定我想要使用的矢量類型。

跟進你的評論:

而不是寫作

using namespace myNamespace<int>;

只需使用模板化的類並改為編寫(或任何變體):

typedef myNamespace::myClass1<int> myClass1Int;
typedef myNamespace::myClass2<int> myClass2Int;

我傾向於認為最好明確使用哪些類型而不是嘗試執行某些特定實例化命名空間的操作。

您能否更全面地描述使您認為模板化命名空間有用的問題?

請記住,您始終可以編寫make_myClass1免費函數來為您推導出模板類型。

你不能這樣做,但你可以提供不同的命名空間和typedef(不是我贊同它)。

namespace template_impl {
   template <typename V>
   class myClass1_tmpl {...};
   template <typename V>
   class myClass2_tmpl {...};
}
namespace myns_Vector1 {
   typedef ::template_impl::myClass1_tmpl<Vector1> myClass1;
   typedef ::template_impl::myClass2_tmpl<Vector1> myClass2;
}
void foo() {
   using namespace myns_Vector1;
   myClass1 mc1;
}

無論如何,我的類有幾個模板參數。 現在我創建了這種方法:

#include <string>
#include <iostream>

namespace myNamespace {
  template<typename _integer, typename _string>
  struct s {
    typedef _integer integer;
    typedef _string string;
  };

  template<class T>
  class classA {
  public:
    static typename T::integer intFunc() { return 1; }
    static typename T::string stringFunc() { return "hallo"; }
  };
}


int main() {
  using namespace myNamespace;

  typedef s<int, std::string> types1;
  typedef s<unsigned int, char*> types2;

  std::cout << classA<types1>::intFunc() << std::endl;
  std::cout << classA<types1>::stringFunc() << std::endl;

  std::cout << classA<types2>::intFunc() << std::endl;
  std::cout << classA<types2>::stringFunc() << std::endl;

}

而且我想我會把它與Mark B的方法結合起來!

干杯,伙計們!

暫無
暫無

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

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