2016-02-15 59 views
2

我有以下功能:自動演繹方法的返回類型

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

謝謝。

+0

的類型是一回事,但你會如何寫在功能上'return'語句? –

回答

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

+0

我不明白爲什麼有明確的'FooAll 。它應該在FooAll和FooOne之間變化,對嗎? – varnie

+0

@varnie一個更多的條件應該解決這個 –

+2

我真的沒有發現這比只使用兩個重載更可讀。 –