使用没有模板参数的模板类

Pau*_*ulH 4 c++ templates

我有一个带有模板类的Visual Studio 2008 C++项目,该模板类在构造函数中获取模板化值,如下所示:

template< typename A >
struct Foo
{
    const A& a_;
    Foo( const A& a ) : a_( a ) { };
};
Run Code Online (Sandbox Code Playgroud)

因此,我必须像这样构造这个类:

int myval = 0;
Foo< int > foo( myval );
Run Code Online (Sandbox Code Playgroud)

int当它已在构造函数中指定时,必须指定为模板参数似乎是多余的.我想用某种方式像这样使用它:

Foo foo( myval );
Run Code Online (Sandbox Code Playgroud)

因为,我得到编译器错误:

error C2955: 'Foo' : use of class template requires template argument list
Run Code Online (Sandbox Code Playgroud)

谢谢,PaulH

Fab*_* A. 7

C++17修复了这个问题,为构造函数引入了模板参数推导

引用Herb Sutter

[...] 你可以只写pair p(2, 4.5);而不是pair<int,double> p(2, 4.5);or auto p = make_pair(2, 4.5);。这非常棒,包括它淘汰了许多“make”助手。


Jam*_*lis 6

如果您根据类型命名,则必须是完整类型(即,Foo<int>而不仅仅是Foo).

一个类可以有多个构造函数,也可能没有构造函数,这些构造函数具有类模板的类型参数的参数,因此没有办法使这个函数适用于所有类模板(在我看来,有时会让这项工作感到困惑,但不是全部时间).

如果您可以根本不命名类型,则可以编写一个MakeFoo<T>()函数模板来构造Foo<T>并使用函数模板参数推导:

template <typename A>
Foo<A> MakeFoo(const A& a) { return Foo<A>(a); }
Run Code Online (Sandbox Code Playgroud)

此模式通常用于C++(例如,参见参考资料make_shared).

但是,如果要将返回的对象存储在变量中,则该变量仍需要具有类型.如果您能够转移到支持C++ 0x的编译器auto(如Visual C++ 2010),那么您可以使用它.否则,您可以使用类似的第三方解决方案BOOST_AUTO或编写自己的解决方案(尽管这可能需要做很多工作( - :).

使用auto,您的代码将如下所示:

auto foo(MakeFoo(myval));
Run Code Online (Sandbox Code Playgroud)