重载rvalue和左值参考的工厂函数 - 高效初始化

时间:2018-02-03 23:23:16

标签: c++ templates

请考虑以下代码:

struct b{
//slow to copy, fast to move data
};

template<class T>
struct c{
    c(T &&, b &&){}
    c(T &&, const b &){}
    //do I have to provide both? 
};

template<class T>
auto
make_c(T &&t, b &&_){
    return c<T>(std::forward<T>(t), std::move(_));
}

template<class T>
auto
make_c(T &&t, const b &_){
    return c<T>(std::forward<T>(t), _);
}
//do I have to make both make_c overloads?

正如评论所说 - 是否有必要同时制作rvalue和lvalue make_function / constructors,或者是否有办法避免代码重复。我必须说我觉得复制大部分功能代码只是删除移动功能时感觉不舒服。

PS:这是一个合成示例 - 由于msvc编译器出现operator |重载问题,因此无法添加额外的模板参数。

1 个答案:

答案 0 :(得分:0)

如果您想避免复制代码,则需要使用转发参考。但是,这些是基于模板参数推导。也就是说,你可以使用这样的东西:

template<typename T, typename B>
auto
make_c(T&& t, B&& _){
    return c<T>(std::forward<T>(t), std::forward<B>(_));
}

虽然使用手动重载可能会起作用,但是当你有多个参数需要对lvalue和rvalue参数进行不同的处理时,这种方法并不常用:所需的重载次数会随着这些参数的数量呈指数级增长。