首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将可能的lvalue引用模板转换为lvalue

将可能的lvalue引用模板转换为lvalue
EN

Stack Overflow用户
提问于 2016-04-28 03:15:18
回答 2查看 65关注 0票数 2

我想要实现的是这样的东西:

代码语言:javascript
复制
template<typename T>
void foo(T t) {
    TWithoutReferenceType t1 = Magic(t); //some magic here
}

TWithoutReference是相同类型的T,但没有引用,因此,例如:

代码语言:javascript
复制
Magic(int i) -> int i
Magic(int& i) -> int i
Magic(int&& i) -> int i 

我不知道这是否有可能用于参考价值,或者它在实践中可能意味着什么。

为什么我需要它:

代码语言:javascript
复制
template <typename ReturnType, typename... Args>
function<ReturnType(Args...)> memoize(const function<ReturnType(Args...)>& func)
{
    return ([=](Args... args) mutable {
        static map<tuple<Args...>, ReturnType> cache;
        tuple<Args...> t(args...);
        auto result = cache.insert(make_pair(t, ReturnType{}));
        ...

例如,如果Args ...vector<double> &,而我改变了元素的顺序,那么cache中的对应键也会被更改,我不希望这种情况发生,所以我不希望将来会有一个键改变作为副作用。

对不起,如果我张贴了整个代码,但我担心,如果我使它更简单,我将失去问题的意义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-28 03:22:49

你发现的是参考文献

如果类型T是引用类型,则提供成员ty对联f类型,它是T.所引用的类型,否则类型为T。 可能的实施 template<类T>结构remove_reference {ty胡枝子T型;};template<类T>结构remove_reference {typedef型;};template<类T>结构remove_reference {typedef型;};

您可以将Magic实现为

代码语言:javascript
复制
template <typename T> 
typename remove_reference<T>::type Magic(T t) { 
    return t; 
}
票数 2
EN

Stack Overflow用户

发布于 2016-04-28 08:06:42

您有几种选择,包括:

代码语言:javascript
复制
template <typename T>
typename std::remove_reference<T>::type Magic(const T& t) { return t; }

代码语言:javascript
复制
template <typename T>
typename std::remove_reference<T>::type Magic(T&& t) { return t; }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36904616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档