2013-11-14 4 views
2

Я сделал класс, который имеет ту же реализацию std::initializer_list с помощью VS2013, который поддерживает Uniform Initialization.Как создать собственный класс initializer_list в C++ 11?

template <class _Elem> 
class My_Initializer_List { ... } // Hope to replace std::initializer_list! 

Первое, что я заметил, что компилятор продолжает искать std::initializer_list, когда он имеет замену для него, что есть My_Initiliazer_List.

void Foo() 
{ 
    // The compiler tries to invoke 
    // its constructor with std::initializer<int>{ 10, 20 }. 
    auto MyVar = My_Initializer_List<int>{ 10, 20 }; // Compile Error! 
} 

Если эта функция зависит от стандартной библиотеки C++, то я считаю, что я должен быть в состоянии заменить его с моим собственным классом, по крайней мере, для академических целей.

Заранее спасибо.

+0

Вы не можете осуществить это – aaronman

+0

@aaronman Еще раз спасибо. Но не могли бы вы быть более конкретными о том, почему? –

+0

Возможный дубликат [Реализация std :: initializer \ _list] (http://stackoverflow.com/questions/18164353/implementation-of-stdinitializer-list) –

ответ

4

Извините, но нет. Компилятор имеет специальное знание std::initializer_list «запеченный в». То же самое относится к нескольким другим частям стандартной библиотеки (например, dynamic_cast ссылки бросает std::bad_cast, и на самом деле вы ничего не можете сделать, чтобы изменить это).

Другими словами, компилятор уже знает о std::initializer_list, даже без (например), включая заголовок. Вы можете включить заголовок для написания кода, который (например) принимает std::initializer_list в качестве параметра, но не нужно включать какой-либо заголовок, чтобы просто написать код, который использует эту нотацию-инициализатор списка.

+2

Это, на мой взгляд, самое неудачное. – Serge

Смежные вопросы