Шаблонные параметры по умолчанию с предописанием

Можно создать новую группу и с апачским пользователем и с пользователем FTP как участники и затем сделать разрешение на папке загрузки 775. Это должно дать и апачским и пользователям FTP способность записать в файлы в папке, но помешать всем остальным изменять их.

18
задан Seth Johnson 24 November 2009 в 19:09
поделиться

4 ответа

Любая единица компиляции, которая использует ваше средство, которое объявляет форвард-файл, в любом случае должна будет включать заголовки boost, за исключением случая, когда у вас есть определенные программы, которые на самом деле не будут использовать часть boost вашего объекта.

Это правда, что с помощью прямого объявления вы можете избежать включения заголовков boost для таких программ. Но вам придется вручную включать заголовки повышения (или иметь #ifdef ) для тех программ, которые действительно используют часть повышения.

Имейте в виду, что в файл можно добавить дополнительные параметры шаблона по умолчанию. будущий релиз Boost. Я бы не советовал использовать этот маршрут. Что я бы подумал, если ваша цель - сократить время компиляции, - это использовать #define , чтобы указать, следует ли отключить код, использующий эту библиотеку ускорения. Таким образом вы избежите хлопот с форвардным объявлением.

2
ответ дан 30 November 2019 в 08:38
поделиться

Я не думаю, что вы можете объявить шаблон с аргументами по умолчанию, если только данная библиотека не предоставила свой собственный заголовок прямого объявления. Это происходит потому, что вы не можете переопределить аргументы по умолчанию (даже если они совпадают... gcc все равно сообщит "error: redefinition of default argument").

Поэтому, насколько мне известно, решение состоит в том, чтобы библиотека поставляла заголовок прямого объявления Foo_fwd.h:

#ifndef INCLUDED_Foo_fwd_h_
#define INCLUDED_Foo_fwd_h_
template<class T, class U=char> class Foo; // default U=char up here
#endif

и тогда полная реализация в Foo.h будет такой:

#ifndef INCLUDED_Foo_h_
#define INCLUDED_Foo_h_
#include "Foo_fwd.h"
template<class T, class U> class Foo { /*...*/ }; // note no U=char here
#endif

Таким образом, теперь ваш код может использовать и Foo_fwd.h... но, к сожалению, поскольку этот подход требует модификации оригинального Foo.h для удаления аргументов по умолчанию, он не подходит для сторонних библиотек. Может быть, нам следует лоббировать команду C++0x, чтобы разрешить эквивалентное изменение аргументов шаблона по умолчанию, а-ля типизаторы...?

8
ответ дан 30 November 2019 в 08:38
поделиться

Что ж, здесь та же проблема. Но с STL.

Если в одном из моих заголовков используется, например. std :: vector, тогда я должен включить весь заголовок. С этого момента каждый раз, когда я включаю свой заголовок, даже если мой исходный код вообще не ссылается на std :: vector, заголовок включается вместе с моим заголовком. Если вы включите этот заголовок в большом количестве мест, это будет означать чрезмерный анализ.

Итак, я пересылаю объявленный std :: vector и использовал std :: vector *, но мой код не хочет компилироваться из-за аргументов по умолчанию. Если я помещаю аргументы по умолчанию в свой заголовок, компилятор отказывается компилировать заголовок stl из-за повторной спецификации аргументов по умолчанию.

В этой ситуации я пытаюсь создать свой собственный класс Vector, который адаптирует std :: vector и пересылает ему каждый вызов метода. Наверное, это могло решить проблему.

0
ответ дан 30 November 2019 в 08:38
поделиться

Да. Аргументы шаблона по умолчанию могут быть указаны в любое время и в любом месте, при условии, что объявления не конфликтуют друг с другом. В конечном итоге они объединяются из различных деклараций.

Даже это допустимо:

template< class A, class B, class C = long >
class X;

template< class A, class B = int, class C >
class X;

template< class A = short, class B, class C >
class X { };

Аналогичный пример приведен в §14.1 / 10. Согласно этому абзацу, аргументы функции по умолчанию ведут себя аналогичным образом.

Удачи в получении форвардного объявления, чтобы оно вело себя и не мешало всему!

14
ответ дан 30 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: