从本质上讲,我希望在此进行模板化函数调用,其中调用方实质上会请求给定类型,并且将指针或引用传递回去。基于模板中给定的类型,如果它是指针,并且如果它是存储的值,我希望返回检索到的未调整指针,我想将类型切换为引用。我还想将这种思想扩展到包括引用,类,指向类的指针等。
#include <utility>
#include <type_traits>
using namespace std;
using namespace std::tr1;
template< bool condition, typename Then, typename Else >
struct IF {
typedef typename Then RET;
};
template<typename Then, typename Else >
struct IF< false, Then, Else > {
typedef typename Else RET;
};
template<class T>
struct ReturnType {
typedef typename IF<std::is_pointer<T>::value, T, T& >::RET RET;
};
template<bool condition, typename U>
struct Member {
Member(){ value = 2; member = &value; };
int value;
int* member;
};
template<typename U>
struct Member<false, U> {
Member(){ member = 5; };
int member;
};
typedef class tagFOO {
public:
template < typename T >
typename ReturnType<T>::RET function()
{
Member<std::is_pointer<T>::value, T> ret;
return ret.member;
};
} FOO;
int main() {
int i = 0;
int* pi = NULL;
FOO A;
i = A.function<int>();
pi = A.function<int*>();
return 0;
}
分别运行5和2时,此代码。
我想这样做的第一个问题是在我希望这样做的地方定义返回类型
auto function()->decltype(typename ReturnType<T>::RET)
代替。我不确定为什么这行不通,但我得到的所有可能组合都无法解决模板错误。
我的第二个问题是处理各种不同的返回类型。这将需要一些尝试,如果我错了,请纠正我,尾随返回类型将是一种快速解决方案,因为编译器似乎忽略了无效返回。我通过简单地传递-> decltype(T)进行了测试,但是我可能在某个地方的测试中犯了一个错误。
我认为我在这里所拥有的足以完成工作。我敢肯定,为什么这可能不是一个好主意,我有一些意见,我很想听听。
谢谢,
BekaD:
最佳答案
也许boost::call_traits可以提供帮助。
http://boost.org/doc/libs/1_45_0/libs/utility/call_traits.htm
关于c++ - 转换 yield ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4564675/