代码之家  ›  专栏  ›  技术社区  ›  f0b0s

构造函数中的C++模板参数

  •  3
  • f0b0s  · 技术社区  · 14 年前

    为什么这段代码不能编译?

    template <class T>
    class A
    {
        public:
                A(T t) : t_(t) {}
    
        private:
                T t_;
    };
    
    
    int main()
    {
        A a(5.5);
        // A<double> a(5.5); // that's what i don't want to do
    }
    

    我希望模板参数是隐式的。

    如本例所示:

    template<class T>
    T Foo(T t) { return t; }
    
    // usage:
    Foo(5.5);
    

    更新 :命名的构造器习惯用法对我来说是不可接受的。我想把这门课用在RAII上。 唯一的办法是 const A& a = A::MakeA(t) 但是很难看!

    1 回复  |  直到 14 年前
        1
  •  9
  •   jpalecek    14 年前

    既然你必须说出变量的类型(C++ 03不能推断变量的类型),你只能这样做:

    A<double> a(5.5); // that's what i don't want to do
    

    当您不需要生成类型的变量,但希望将其传递给其他函数时,情况会简单一些。在这种情况下,定义一个辅助的“构造函数函数”(请参见 std::make_pair ):

    template <class T>
    A<T> make_a(T t) { return A<T>(t); }
    

    然后这样使用:

    another_function(make_a(1.1));
    

    在C++ 0x中,你甚至可以做到。

    auto a(make_a(5.5));
    

    定义变量 a .

    然而,推断 A 其构造函数中的参数通常是不可能的,因为您无法区分哪些专门化具有给定类型的转换构造函数。假设有一个专门化

    template <>
    struct A<void>
    {
      A(double);
    };