在定义专用模板类构造函数时避免重复

Jac*_*eth 1 c++ templates c++11

假设我有一个模板类:

template<typename T>
class Widget {
public:
    Widget(const std::string& name, int i) : t_(name),  cf_(name), ci_(i) {}
private:
    T t_;
    const Foo cf_;
    const int ci_;
}
Run Code Online (Sandbox Code Playgroud)

并且假设,在这种情况下,T只会是Fooint.比其他任何事情Widget<Foo>,并Widget<int>在这方面无稽之谈.

上面声明的构造函数适用于Widget<Foo>.有没有一种方法可以定义一个专门的构造函数Widget<int>,它以t_不同的方式分配,但没有复制粘贴的初始化cf_ci_

在事精神调用类似Base(a)Derived::Derived(int a, int b) : Base(a), b_(b) {}吧?

Jar*_*d42 5

标签调度和转发构造函数可能会有所帮助

template <typename> struct Tag {};


template<typename T>
class Widget {
public:
    Widget(const std::string& name, int i) : Widget(Tag<T>{}, name, i) {}

private:
    Widget(Tag<int>, const std::string& name, int i) :
        Widget(Tag<void>{}, 42, name, i)
    {}

    Widget(Tag<Foo>, const std::string& name, int i) :
        Widget(Tag<void>{}, name, name, i)
    {}

    template <typename U>
    Widget(Tag<void>, U&& u, const std::string& name, int i) :
         t_(std::forward<U>(u)),
         cf_(name),
         ci_(i)
    {}

private:
    T t_;
    const Foo cf_;
    const int ci_;
};
Run Code Online (Sandbox Code Playgroud)