自动推导方法的返回类型

时间:2016-02-15 11:39:34

标签: c++ c++11 type-inference

我有以下功能:

//method takes 2 or more template parameters    
template <class A1, class A2, class ...Ax>
Value<FooMany> getValue() {

    //note, FooAll's ctor takes std::string and std::initializer_list<std::size_t>

    FooAll<Item> hairyStructure("abc", { Foo<A1>::getIndex(), Foo<A2>::getIndex(), Foo<Ax>::getIndex() ... } );
    return Value<FooMany>(someData, hairyStructure);
}

//method takes only 1 template parameter
template <class A>
Value<FooSingle> getValue() {

    //note, FooOne's ctor takes std::string and std::size_t

    FooOne<Item> hairyStructure("abc", Foo<A>::getIndex() );
    return Value<FooSingle>(someData, hairyStructure);
}

显然,这些功能的类型是不同的。

我想知道,是否有可能将这两者压缩到单一方法中,利用C ++ 11特性(我认为是decltype), 会自动推断出返回类型吗?

所以,基本上,如果Value<FooSingle>被调用为

,它应该返回getValue

GetValue<A>();

如果以

调用它,它应返回Value<FooMany>

GetValue<A, B>();

GetValue<A, B, C>();

我不确定我的术语是否正确“方法需要2个或更多模板参数”。如果错误请纠正我。

如果有帮助,我的问题会继续上一个主题:C++11 parameters pack overload

谢谢。

1 个答案:

答案 0 :(得分:1)

#include <type_traits>

template <class A1, class... Ax>
auto getValue()
    -> Value<typename std::conditional<sizeof...(Ax) == 0
                                     , FooSingle, FooMany>::type>
{
    typename std::conditional<sizeof...(Ax) == 0
                            , FooOne<Item> 
                            , FooAll<Item>>::type
              hairyStructure("abc", { Foo<A1>::getIndex(), Foo<Ax>::getIndex()... } );
    return Value<typename std::conditional<sizeof...(Ax) == 0
                                         , FooSingle, FooMany>::type>(hairyStructure);
}

DEMO