2

我想std::tuple_cat从我的函数返回结果,但我无法推断出返回类型

#include <tuple>

struct H {
    typedef std::tuple<int,int> tuple_type;
    tuple_type a {1,2};
};

template <typename tuple_holder_type, typename B>
???
func(tuple_holder_type h, B b) {
    return std::tuple_cat(h.a,std::make_tuple(b));
}

int main(int argc, char const *argv[]) {
    auto h = H();
    auto b = 3;
    auto c = func(h,b);
    return 0;
}

我试图结合std::result_ofstd::tuple_cat喜欢这样

typename std::result_of<std::tuple_cat(tuple_holder_type::tuple_type,std::tuple<B>) >::type

但只收到错误消息

test.cpp:9:85: error: template argument 1 is invalid
test.cpp:9:86: error: expected identifier before '::' token
test.cpp:10:1: error: expected initializer before 'func'

问题:我要放什么而不是问号才能使它起作用

奖金 q:为什么它有效

编辑 忘了提到我需要这样一种方式,我可以将结果类型放入 a 中typedef,从而产生类似

template <typename tuple_holder_type, typename B>
struct tuple_appender {
    typedef ??? return_type;
    return_type operator() /*...*/
}

谢谢你 :)

4

1 回答 1

5

在 C++11 中,您可以decltype这样使用:

template <typename tuple_holder_type, typename B>
auto
func(tuple_holder_type h, B b)
    -> decltype(std::tuple_cat(h.a,std::make_tuple(b)))
{
    return std::tuple_cat(h.a,std::make_tuple(b));
}

在 C++1y 工作草案中,您可以删除decltype这样的内容:

template <typename tuple_holder_type, typename B>
auto
func(tuple_holder_type h, B b)
{
    return std::tuple_cat(h.a,std::make_tuple(b));
}

以下是获取 的返回类型func并将其放入 a 中的typedef方法,无论func' 的返回类型是如何编码的:

template <typename tuple_holder_type, typename B>
struct tuple_appender {
    typedef decltype(func(std::declval<typename tuple_holder_type::tuple_type>(),
                          std::declval<std::tuple<B>>())) return_type;
};

std::declval<T>()只是一种获得类型右值表达式T而无需默认构造的方法,例如T(). 您可能不想假设这T是默认可构造的。您还可以获得 with 的左值表达式,或Twithdeclval<T&>()的 const 左值表达式declval<const T&>()等。

于 2013-08-25T14:41:24.457 回答