[英]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.