将可能的左值参考模板转换为左值

时间:2016-04-28 03:15:19

标签: c++ templates c++11

我想要达到的目标是:

template<typename T>
void foo(T t) {
    TWithoutReferenceType t1 = Magic(t); //some magic here
}

TWithoutReferenceT的类型相同但没有引用,例如:

Magic(int i) -> int i
Magic(int& i) -> int i
Magic(int&& i) -> int i 

我不知道rvalue引用是否可行,或者它在实践中可能意味着什么。

为什么我需要它

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中的对应键也会更改,我也不希望这样发生了,所以我不希望将来作为副作用发生重大变化。

很抱歉,如果我发布了整个代码,但我担心如果我更简单,我就会失去这个问题。

2 个答案:

答案 0 :(得分:2)

您发现的是std::remove_reference

  

如果类型T是引用类型,则提供成员typedef类型,它是T引用的类型。否则类型为T.

     

可能的实施

template< class T > struct remove_reference      {typedef T type;};
template< class T > struct remove_reference<T&>  {typedef T type;};
template< class T > struct remove_reference<T&&> {typedef T type;};

您可以将Magic实现为

template <typename T> 
typename remove_reference<T>::type Magic(T t) { 
    return t; 
}

答案 1 :(得分:2)

您有多种选择,包括:

template <typename T>
typename std::remove_reference<T>::type Magic(const T& t) { return t; }

template <typename T>
typename std::remove_reference<T>::type Magic(T&& t) { return t; }