具有非参数模板类型的类构造函数

CAd*_*ker 2 c++ templates

对于普通的C++函数,可以在参数列表中显示模板参数:

template<typename T>
T default_construct()
{
    return T();
}
Run Code Online (Sandbox Code Playgroud)

并称之为

some_type x = default_construct<some_type>();
Run Code Online (Sandbox Code Playgroud)

即使我使用的类型不在参数列表中,我仍然可以将它传递给函数.现在,我想在类构造函数中执行此操作:

struct Base;

template<typename T>
Base* allocate()
{
    return new T; //Assume T derives from Base...
}

struct factory {
    template<typename T>
    factory()
        : func(allocate<T>)
    {}

    std::tr1::function<Base*()> func;
};
Run Code Online (Sandbox Code Playgroud)

但是当我想构造一个实例时,我找不到一种方法来为构造函数提供参数factory.

有没有办法在将类转换为模板化类或将一些未使用的T对象发送到构造函数的情况下执行此操作?

Joh*_*itb 9

不,没有办法做到这一点.在该说明14.8.1/5中的标准解释了为什么

[注意:因为显式模板参数列表遵循函数模板名称,并且因为在不使用函数名称的情况下调用转换成员函数模板和构造函数成员函数模板,所以无法为这些函数模板提供显式模板参数列表.]

当然,它不需要是T您发送的对象.它可以是T在其类型中编码的任何对象

template<typename T> struct type2type { };

struct factory {
    template<typename T>
    factory(type2type<T>)
        : func(allocate<T>)
    {}

    std::tr1::function<Base*()> func;
};

factory f((type2type<Foo>()));
Run Code Online (Sandbox Code Playgroud)