Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А ведь дата выхода уж намечена, красные ленточки натянуты, водка на фуршетных столах греется, а жаркое — остывает.
В С++0x столько революционного и нового
новый проект на чистом С++/CLI никто начинать не будет
В самом деле, управляемый С++, странноватое детище Microsoft, созданное даже не как новый язык, а как «мостик» между старым кодом на С++ и платформой .NET, имеет почти все описанное в статье — и концепты, и сборщик мусора, и модули, и всю мощь библиотеки классов .NET и Reflection.
Тут надо объяснить, что Reflection, сборка мусора и остальные плюшки доступны только для managed классов (для тех, кто не знает в C++ CLI есть два типа классов — первый, который компилируется в MSIL и второй — который компилируется в нативный код) и традиционные возможности C++ расширяют слабо. Если вы пишете неуправляемый класс, то получаете не больше, чем в любом другом компиляторе С++.
Этот пример показывает, всего лишь, что c помощью определенного вмешательства в язык, можно сделать для него компилятор в .Net
То есть на выходе мы имеем компилятор С++ с поддержкой всех фич, в качестве рантайма у которого в данном случае используется .NET
Рантайм .Net используется только для классов, объявленных специальным образом, весь код написанный на синтаксисе классического С++ компилируется так же, как и в обычном С++ компиляторе, и все плюшки для него недоступны.
Создание «рантайм для C++, в котором могли бы существовать перечисленные фичи» для обычных С++ классов, с обеспечением обратной совместимости, по моему скромному мнению — задача очень сложно решаемая.
давно пора было бы выпустить несовместимую версию языка, из которой убрать пару глупостей и добавить пару хороших вещей
// много проще, понятнее и надёжнее написать
class Matrix(T) if( isNumeric!(T) )
{
....
}
чем
class Matrix<>
{
static_assert();
}
class Matrix { ... }
class Matrix { ... }
class Matrix { ... }
... и так далее
Модули:
Pimpl'ы в топку
Объявления friend классов не нужны (внутри модуля все поля доступны)
Просто меньше мороки с парами h/cpp.
Библиотека
кросплатформенно даже создать каталог нельзя. Любой более менее серьёзный проект начинается с создания обёрток над виндовыми и линуксовыми функциями.class Matrix<>
{
static_assert();
}
class Matrix<int> { ... }
class Matrix<short> { ... }
class Matrix<unsigned int> { ... }
...
class Matrix(T) if( isNumeric!(T) )
template <typename T> class c1 {
BOOST_STATIC_ASSERT(boost::is_arithmetic<T>::value);
};main.cpp: In instantiation of 'c1<void>':
main.cpp:13:11: instantiated from here
main.cpp:8:2: error: static assertion failed: «boost::is_arithmetic<T>::value»
class Matrix(T) if( isIntegral!(T) ) {}
class Matrix(T) if( isFloating!(T) ) {}
#include "stdafx.h"
#include <type_traits>
template< class T, class EnableIf = void >
struct Matrix
{
static_assert( !std::is_same< T, T >::value, "Invalid T, must be integral or floating!" );
};
template< class T >
struct Matrix< T, typename std::enable_if< std::is_integral< T >::value >::type >
{
void Who() const { std::cout << "I'm integral matrix!" << std::endl; }
};
template< class T >
struct Matrix< T, typename std::enable_if< std::is_floating_point< T >::value >::type >
{
void Who() const { std::cout << "I'm floating point matrix!" << std::endl; }
};
int _tmain( int, _TCHAR*[] )
{
Matrix< int >().Who();
Matrix< double >().Who();
// Generates error
// Matrix< std::string >();
return 0;
}
Тут надо объяснить, что Reflection, сборка мусора и остальные плюшки доступны только для managed классов (для тех, кто не знает в C++ CLI есть два типа классов — первый, который компилируется в MSIL и второй — который компилируется в нативный код) и традиционные возможности C++ расширяют слабо. Если вы пишете неуправляемый класс, то получаете не больше, чем в любом другом компиляторе С++.
занимало полторы сотни страниц (при том что весь остальной стандарт — около 800
В С++0х сборщика мусора не будет.
Thread pools, task launching, and reader-writer locks
Не знаю, откуда эта цифра, но у меня в финальном черновике 1338 страниц.
Не «не будет», а в стандарте определено как «зависит от реализации».
Не забывайте, что в новом стандарте есть новая глава Threads на 50 страниц. Почти всё, что нужно программисту для multithread-программирования там есть.
In a garbage-collecting implementation, the fact that a region in an object is registered with declare_no_pointers() should not prevent the object from being collected.А для чего там написаны разделы «20.6.4 Pointer safety» и «3.7.4.3 Safely-derived pointers»?
вы получаете список наведённых ошибок, а это уже не камильфо. Одно дело когда чёрным по белому написано — ошибка в такой-то строке вашего файла, а далее, опционально, прицеплены все последствия этой ошибкиТак оно практически так и есть, за тем исключением, что ошибку надо искать в конце рядом со словами while instantiating template foo in source.cpp. А «наведенность» ошибок это из-за SFINAE.
C++0x. Не вошедшее