ПрограммированиеФорумОбщее

C++11 (C++0x), знаем ли мы его? Так ли он хорош? (14 стр)

Страницы: 110 11 12 13 14 15 Следующая »
#195
0:15, 15 дек 2011

kipar
> Т.е. в D по-твоему есть слабенький рефлекшн, я правильно понимаю?
От рефлекшена намного больше пользы для рантайма, но в этом тоже что-то есть. Возможности метапрограммирования точно расширяет.

#196
1:43, 15 дек 2011

laMer007
> Убрал, не компилируется. Верное поведение, всё правильно.
> Видимо, это был сарказм на тему > > * = \ >> *=?
Да, это был он. Точнее, на тему того, что вместо по-настоящему уместных фич там занимались борьбой с угловыми скобками.

#197
1:58, 15 дек 2011

laMer007
> Кстати, рефлекшен во время компиляции для классов C++ - это тоже было бы
> хорошо.
а, я думал ты про C++ :)

#198
21:58, 24 дек 2011
namespace Lib
{
  inline namespace Lib_1
  {
    template <typename T> class A; 
  }

  template <typename T> void g(T);
}
...
struct MyClass { ... };
namespace Lib
{
  template<> class A<MyClass> { ... };
}

int main()
{
  Lib::A<MyClass> a;
  g(a);  // ok, Lib is an associated namespace of A
}

> inline namespace Lib_1
Зачем нужен namespace inline?
Чем не устроило следующее решение или я не так понял?

namespace Lib_1
{
    template <typename T> class A; 
}
using namespace Lib_1;
#199
22:21, 24 дек 2011

Хорошо написано вот: http://www2.research.att.com/~bs/C++0xFAQ.html#inline-namespace
Т.е. вложенный инлайн неймспейс будет доступен по его полному "пути", а также будет торчать наружу в качестве реализации по умолчанию.

#200
22:33, 24 дек 2011

RPGman
> Т.е. вложенный инлайн неймспейс будет доступен по его полному "пути", а также
> будет торчать наружу в качестве реализации по умолчанию.
Зачем это нужно, если есть?

namespace Lib_1
{
    template <typename T> class A; 
}
using namespace Lib_1;

> inline namespace Lib_1
Бесполезный синтаксический сахар.

#201
22:46, 24 дек 2011

laMer007
> Бесполезный синтаксический сахар.
В случае нескольких версий библиотеки где будешь писать using namespace Lib_1?

namespace BigLib
{
    namespace Lib_2
    {
        template <typename T> class A;
    }
    namespace Lib_1
    {
        template <typename T> class A;
    }
}
#202
22:59, 24 дек 2011

RPGman
> В случае нескольких версий библиотеки где будешь писать using namespace Lib_1?
После той, которая default. В чем проблема?

// file V99.h:
  namespace V99 {
    void f(int);  // does something better than the V98 version
    void f(double);  // new feature
    // ...
  }
  using namespace V99; 

  // file V98.h:
  namespace V98 {
    void f(int);  // does something
    // ...
  }

  // file Mine.h:
  namespace Mine {
  #include "V99.h"
  #include "V98.h"
  }

  #include "Mine.h"
  using namespace Mine;
  // ...
  V98::f(1);  // old version
  V99::f(1);  // new version
  f(1);    // default version
#203
23:15, 24 дек 2011

laMer007
> В чем проблема?
В специализации шаблонов из библиотеки.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm

#204
15:30, 28 дек 2011

Странная ситуация:
Для

int ca[]={1,8,3,4,4,6};
array<int,6> a={1,8,3,4,4,6};

получаю

Compilation output:
source.cpp: In function 'int main()':
source.cpp:9:30: warning: missing braces around initializer for 'std::array<int, 6u>::value_type [6] {aka int [6]}' [-Wmissing-braces]

А так не получаю:

int ca[]={1,8,3,4,4,6};
array<int,6> a={{1,8,3,4,4,6}};

С чем это может быть связано? Что-за прихоть?

Ещё одно неудобство есть в С++11: Для сишного массива int ca[]={34, 56} кол-во элементов массива выводится автоматически из списка инициализации. А вот для С++'ного массива array<int, 2> a={{34, 56}}; приходится указывать кол-во элементов массива вручную, что не красиво и не удобно.
Хоть бы функцию генератор для массива написали, типа make_array, чтобы писать:

auto a=make_array({34, 56});
#205
16:13, 28 дек 2011

laMer007
> Хоть бы функцию генератор для массива написали, типа make_array, чтобы писать:
не проверял, но должно работать

#define MAKE_ARRAY( _type, _name, _init_list ) \
    _type  __##_name[] = _init_list; \
    array< _type, count_of( __##_name ) >  _name( __##_name )

// использовать так:
MAKE_ARRAY( int, a, { 1, 2, 3, 4, 5, 6 } );
#206
18:22, 28 дек 2011

/A\
> не проверял, но должно работать
Не работает count_of нет в стандарте.
Это не красиво, это не будет правильно работать для 0 элементов, и вообще не работает.

#207
19:07, 28 дек 2011

laMer007
> Не работает count_of нет в стандарте.
Можно самому определить макрос.

Запятые все портят, но можно заставить работать.

#208
19:47, 28 дек 2011

/A\
> Запятые все портят, но можно заставить работать.
Очень не красиво, так что лучше этим не пользоваться. :(

Написать функцию вида auto a=make_array({34, 56, 11...}); или auto a=make_array(34, 56, 11...); не удается.

#209
21:27, 28 дек 2011

laMer007
> Написать функцию вида auto a=make_array({34, 56, 11...}); или auto
> a=make_array(34, 56, 11...); не удается.
А мне удалось, но получилось еще страшнее.

Еще переделал макрос, теперь смотрится получше.

Страницы: 110 11 12 13 14 15 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.