2

本质上,我在这里喜欢做的是进行模板化函数调用,其中调用者本质上请求给定类型,并且将传回指针或引用。根据模板中给出的类型,我希望返回检索到的未调整指针,如果它是一个指针,如果它是一个存储值,我想将类型切换为引用。我还想扩展这个想法,包括引用、类、指向类的指针等等......

#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) 来测试的,但我可能在某处的测试中犯了错误。

我认为我在这里所拥有的足以完成这项工作。我敢肯定有一些关于为什么这可能不是一个好主意的意见,我很想听听这些意见。

谢谢,贝卡德:

4

1 回答 1

1

也许 boost::call_traits 可以提供帮助。

http://boost.org/doc/libs/1_45_0/libs/utility/call_traits.htm

于 2010-12-31T01:59:37.417 回答