我想要达到的目标是:
template<typename T>
void foo(T t) {
TWithoutReferenceType t1 = Magic(t); //some magic here
}
TWithoutReference
与T
的类型相同但没有引用,例如:
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
中的对应键也会更改,我也不希望这样发生了,所以我不希望将来作为副作用发生重大变化。
很抱歉,如果我发布了整个代码,但我担心如果我更简单,我就会失去这个问题。
答案 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; }