gen*_*ult 5 c++ templates constructor
有没有办法以"漂亮" 的方式使用Named Constructor Idiom模板?
例如:
#include <vector>
using namespace std;
template< typename T >
class Foo
{
public:
static Foo Copy(const T& arg)
{
Foo ret;
ret.t_copy = arg;
return ret;
}
static Foo CopyClear(const T& arg)
{
Foo ret;
ret.t_copy = arg;
ret.t_copy.clear();
return ret;
}
private:
T t_copy;
};
int main( int argc, char** argv )
{
vector<double> vec;
vec.push_back(1);
// #1: won't compile
Foo< vector<double> > a_foo = Foo::CopyClear( vec );
// #2: ugly, but works
Foo< vector<double> > a_foo = Foo< vector<double> >::CopyClear( vec );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想以#1某种方式使用语法. #2工作,但以错误的方式磨擦我的DRY感觉.
编辑:新的,更"现实"的版本Foo.
编辑2:没有C++ 0x/C++ 1x对我来说我害怕:(
更新的答案
如果我正确理解你的意图,这就会成功:
template< typename T >
class Foo
{
private:
friend class FooHelper;
size_t sz;
};
class FooHelper
{
public:
template< typename T >
static Foo<T> Size(const T& arg)
{
Foo<T> ret;
ret.sz = arg.size();
return ret;
}
template< typename T >
static Foo<T> HalfSize(const T& arg)
{
Foo<T> ret;
ret.sz = arg.size() / 2;
return ret;
}
};
Run Code Online (Sandbox Code Playgroud)
然后编译:
int main( int argc, char** argv )
{
vector<double> vec;
vec.push_back(1);
Foo<vector<double>> a_foo = FooHelper::HalfSize( vec );
}
Run Code Online (Sandbox Code Playgroud)