C++ 避免使用“const X&;函数”的两个版本及"X& ;`

C++ 避免使用“const X&;函数”的两个版本及"X& ;`,c++,c++11,C++,C++11,考虑以下代码: template<typename X> struct Store { X x; }; template<typename X> Store<X> store(X x) { /* a lot of code */ return Store<X>{x}; } void foo_cr(const int& a) { auto s = store(a); } void foo_r(int& a) {

考虑以下代码:

template<typename X>
struct Store { X x; };

template<typename X>
Store<X> store(X x) { /* a lot of code */ return Store<X>{x}; }

void foo_cr(const int& a) {
    auto s = store(a);
}

void foo_r(int& a) {
    auto s = store(a);
}

函数体完全相同,我希望避免重复的定义。

以下可能是您要查找的内容:

template<typename X>
Store<X&> store(X& xa)
{
    auto x=xa;
    /* a lot of code */
    return Store<X&>{x};
}
模板
商店(X&xa)
{
自动x=xa;
/*很多代码*/
返回存储{x};
}

它会将
X
推断为
Y
const Y
,但它会将您限制为引用。此外,
autox=xa
将确保您在方法内部获得类型为
Y
的副本。不确定这是否真的符合您的需要,但如果没有进一步的信息,很难说。

是否有原因说明store参数不能始终为
常量?@KillianDS:有时我想更改存储的对象…@Danvil,为什么更新中模板参数旁边的
&
?我刚刚回滚了您的编辑。很抱歉,您不能在有人回答后更新整个代码问题。你刚刚否定了有人花时间写的两个答案。如果您对其中一个答案有疑问,请添加评论。否则,如果您有不同的问题,请发布另一个问题。谢谢。@Jeffrey:我的更新更明确地表明了我的问题的意图。我认为这是有价值的信息。如果我的措辞误导或冒犯了您,请原谅。即使是您的编辑(由Jeffrey回滚,我个人觉得有点苛刻)也无济于事:这取决于
/*很多代码*/
部分以及您对
x
的处理方式。我认为我的答案和杰弗里的答案都提供了一些想法,但你必须检查自己什么最适合你的需要。通常情况是这样的:SO可以提供想法并帮助您学习,但应用它仍然取决于您:)
template<typename X>
Store<X&> store(X& xa)
{
    auto x=xa;
    /* a lot of code */
    return Store<X&>{x};
}