从本质上讲,我希望在此进行模板化函数调用,其中调用方实质上会请求给定类型,并且将指针或引用传递回去。基于模板中给定的类型,如果它是指针,并且如果它是存储的值,我希望返回检索到的未调整指针,我想将类型切换为引用。我还想将这种思想扩展到包括引用,类,指向类的指针等。

#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/

10-13 08:29