代码之家  ›  专栏  ›  技术社区  ›  Yippie-Ki-Yay

C++模板构造程序

  •  95
  • Yippie-Ki-Yay  · 技术社区  · 14 年前

    我希望有一个没有参数的模板构造函数的非模板类。

    我说得对吗? ), 解决方法如下:

    class A{
       template <typename U> A(U* dummy) {
       // Do something
       }
    };
    

    也许有更好的选择(或者更好的解决方法)?

    8 回复  |  直到 7 年前
        1
  •  101
  •   James McNellis    14 年前

    调用构造函数模板时无法显式指定模板参数,因此必须通过参数演绎来推导它们。这是因为如果你说:

    Foo<int> f = Foo<int>();
    

    这个 <int> 是类型的模板参数列表 Foo

    即使有了解决方法,仍然必须传递参数才能调用该构造函数模板。根本不清楚你在努力实现什么。

        2
  •  33
  •   KeatsPeeks    14 年前

    可以创建模板化工厂函数:

    class Foo
    {
    public:
        template <class T> static Foo* create() // could also return by value, or a smart pointer
        {
            return new Foo(...);
        }
    ...        
    };
    
        3
  •  24
  •   Johannes Schaub - litb    14 年前

    据我所知,这是不可能的(因为它会与默认构造函数冲突-我是对的吗?)

    你错了。没有任何冲突。你不能叫它永远。

        4
  •  20
  •   Yakk - Adam Nevraumont    10 年前
    template<class...>struct types{using type=types;};
    template<class T>struct tag{using type=T;};
    template<class Tag>using type_t=typename Tag::type;
    

    上面的帮助程序允许您使用类型作为值。

    class A {
      template<class T>
      A( tag<T> );
    };
    

    这个 tag<T> 类型是一个变量,除了它的龋齿类型之外没有状态。可以使用此函数将纯类型值传递到模板函数中,并由模板函数推导类型:

    auto a = A(tag<int>{});
    

    您可以传入多个类型:

    class A {
      template<class T, class U, class V>
      A( types<T,U,V> );
    };
    auto a = A(types<int,double,std::string>{});
    
        5
  •  16
  •   sehe    13 年前

    • 如果你申报 任何 一),编译器将避免 声明默认构造函数。
    • 除非声明一个复制构造函数(对于类X 1 这需要 X X& X const & )编译器将生成
    • 如果为类X提供模板构造函数,则 T const & T T& 然后 默认非模板 复制构造函数,尽管您可能认为不应该这样做,因为当t=X时,声明与复制构造函数声明匹配。
    • 在后一种情况下,您可能需要提供一个非模板化的复制构造函数和模板化的复制构造函数。他们不会冲突的。当X被传递时,将调用非模板化的。否则模板

    高温高压

        6
  •  2
  •   Tolli    8 年前

    你可以这样做:

    class C 
    {
    public:
        template <typename T> C(T*);
    };
    template <typename T> T* UseType() 
    {
        static_cast<T*>(nullptr);
    }
    

    C 使用 int 作为构造函数的模板参数:

    C obj(UseType<int>());
    

    由于不能将模板参数传递给构造函数,因此此解决方案实质上是将模板参数转换为常规参数。使用 UseType<T>()

    这种情况的一个用例是,构造函数创建一个派生类对象,并将其分配给一个成员变量,该成员变量是基类指针。(构造函数需要知道要使用哪个派生类,但类本身不需要模板化,因为始终使用相同的基类指针类型。)

        7
  •  0
  •   user2616927    11 年前

    试着做一些像

    template<class T, int i> class A{
    
        A(){
              A(this)
        }
    
        A( A<int, 1>* a){
              //do something
        }
        A( A<float, 1>* a){
             //do something
        }
    .
    .
    .
    };
    
        8
  •  0
  •   Joshua Chia    10 年前

    这是一个解决办法。

    创建a的模板子类B。在a的构造函数中独立于模板参数的部分构造。在B的构造函数中执行模板参数依赖部分。