命名构造函数成语和模板?

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对我来说我害怕:(

Jon*_*Jon 3

更新的答案

如果我正确理解你的意图,这就会成功:

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)