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

时间:2010-08-19 11:12:21

标签: c++ templates

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

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

UPDATE :我不接受named-constructor idiom。我想把这个类用于RAII。 唯一的方法是const A& a = A::MakeA(t),但这很难看!

1 个答案:

答案 0 :(得分:9)

由于您必须命名变量的类型(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);
};