基本上我喜欢在这里做的是进行模板化函数调用,其中调用者实质上请求给定类型,并且将传递指针或引用。基于模板中给出的类型,我希望返回检索到的未调整指针(如果它是指针),如果它是存储值,我想将类型切换为引用。我还想扩展这个想法,包括引用,类,类的指针等......
#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)
代替。我不确定为什么这不起作用我只是在我可能想象的任何组合中得到一个未解决的模板错误。
我的第二个问题是处理各种不同的返回类型。这将是一个有点试验,并纠正我,如果我错了,一个尾随的返回类型将是一个快速修复,因为编译器似乎忽略无效的返回。这是我通过简单传递 - &gt; decltype(T)测试的东西,但我可能在某个地方的测试中犯了错误。
我认为我所拥有的就足以完成工作。我肯定有一些意见,说明为什么这可能不是一个好主意,我很乐意听到这些。
THX, BekaD:
答案 0 :(得分:1)
也许boost :: call_traits可以提供帮助。
http://boost.org/doc/libs/1_45_0/libs/utility/call_traits.htm