簡體   English   中英

c++ std::make_any 的第二種形式如何工作?

[英]How does the second form of c++ std::make_any work?

c++ function std::make_any有兩種形式,

template< class T, class... Args >
std::any make_any( Args&&... args );                                (1)

template< class T, class U, class... Args >
std::any make_any( std::initializer_list<U> il, Args&&... args );   (2)

第二種形式是如何工作的? 為什么不只是

template< class T, class U>
std::any make_any( std::initializer_list<U> il) ?

例如,在這個聲明中,

std::any a = std::make_any<std::list<int>>({1,2,3}).

或者您可以將它與 initializer_list 和其他一些 arguments 一起調用,例如 {1,2,3}, 4,5? 這里的 args 是用於構造 il 還是用於列表?

第二個 for 存在的原因是由於std::initializer_list不能很好地使用模板參數推導。 想象一下,您擁有提供第二種形式的實現(使用std::make_any作為實現);

template< class T, class... Args >
std::any poor_make_any(Args&&... args)
{
    return std::make_any<T>(std::forward<Args>(args)...);
}

這適用於例如

struct Test {
    Test(std::initializer_list<int>) {}
    Test(int) {}
};

std::any x = poor_make_any<Test>(42);

但它無法編譯

std::any x = poor_make_any<Test>({1, 2, 3});

再次因為std::initializer_list<int>不能由編譯器推斷。 雖然您始終可以指定第二個模板參數,但這對於來自make_系列的 function 來說過於冗長,這意味着它是一個演繹助手。

最后,剩余的 arguments 只是您免費獲得的額外靈活性。 想象一下Test示例的這個額外的構造函數,

Test(std::initializer_list<int>, int) {}

它只適用於

std::any x = std::make_any<Test>({1,2,3}, 42);

雖然如果那個可變參數的第二部分不存在,你必須

std::any x = std::make_any<Test, std::initializer_list<int>, int>({1,2,3}, 42);

這顯然不是超級方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM