2016-07-14 181 views
1

我試圖創建一個模板,它允許調用者指定自己的格式良好的分配方法,但我遇到了傳遞可變參數模板參數的問題。C++模板函數別名作爲可變參數模板參數

如果我不通過任何參數,一切都按預期工作;但是,如果我傳遞一個或多個參數,則會出現編譯錯誤「函數調用的參數太多」。

我在做什麼錯?

#include <cstdio> 
#include <memory> 

template <typename T, typename... Args> 
using allocator = std::unique_ptr<T>(Args...); 

template <typename T, allocator<T> A, typename... Args> 
std::unique_ptr<T> get(Args... args) { 
    return A(args...); 
} 

int main() { 
    auto up1 = get<int, std::make_unique<int>>(); // Works 

    auto up2 = get<int, std::make_unique<int>>(1); // Too many arguments 
                // expected 0, have 1 

    printf("%d\n", *up1); 
    printf("%d\n", *up2); 
} 
+0

[這](http://coliru.stacked-crooked.com/a/cd68dec6691d5323)_works_,但是這真的是你想要的界面..?這對我來說似乎是[XY問題](http://meta.stackexchange.com/a/66378/166663)。 – ildjarn

+0

我可能會重構來更改界面,但我仍然對理解底層問題很感興趣。爲什麼可變參數在這種情況下不適用於模板別名? –

+1

'allocator '是'allocator ,它是'std :: unique_ptr ()',然後調整爲'std :: unique_ptr (*)()'。 –

回答

0

可以代替允許和推導出可能狀態仿答:幾個大括號的類型,但它很難得到這個錯誤:

#include <cstdio> 
#include <memory> 

template <typename T> 
struct allocator{ 
    template<typename... Args> 
    auto operator()(Args&&... args) const { 
     return std::make_unique<T>(std::forward<Args>(args)...); 
    } 
}; 

template <typename T, typename A = allocator<T>> 
auto get(A a=A{}) { 
    return [a](auto... args){ 
     return a(args...); 
    }; 
}; 


int main() { 
    auto up0 = get<int>()(); 
    auto up1 = get<int>()(1); 
    auto up0b = get<int>(allocator<int>())(); 
    auto up1b = get<int>(allocator<int>())(1); 
    auto up0c = get<int>([](auto ... args){ return std::make_unique<int>(args...); })(); 
    auto up1c = get<int>([](auto ... args){ return std::make_unique<int>(args...); })(1); 

    printf("%d\n", *up0); 
    printf("%d\n", *up0b); 
    printf("%d\n", *up0c); 
    printf("%d\n", *up1); 
    printf("%d\n", *up1b); 
    printf("%d\n", *up1c); 
} 

還請注意,我用make_unique也在allocator,但你可能做一個版本,接受一個指針構造unique_ptr與。

Live DEMO here

+0

我做了,但我有不到15代表(新帳戶),所以它不顯示。 –