2012-12-21 3 views
0

Можно создать дубликат:
How to declare a friend class conditionally?Можно ли условно объявить класс друга в C++ 11?

Этот вопрос ответвляется от Can friend class be declared conditionally in C++03?. В частности, предоставляет ли C++ 11 какие-либо дополнительные опции, которые могут помочь при условном объявлении класса друзей? То есть, возможно ли это сделать в C++ 11?

Пройдя через cplusplus.com, я наткнулся на std::enable_if. Я попытался использовать его, но не смог понять правильный синтаксис. Является ли std::enable_if правильной конструкцией для использования для этой цели? Ниже приведен код, который я пробовал, на основании приведенного здесь примера. Мне здесь не нужен шаблон, но я не знаю, как его избежать, поскольку все приведенные здесь примеры кода используют его.

class Foo { 
    template<typename T> struct std::enable_if<true, T> { 
     typedef T Bar; 
     friend class Bar; 
    }; 
}; 

Это дает следующее сообщение об ошибке компиляции:

prog.cpp:5:36: error: 'enable_if' is not a template 
prog.cpp:5:55: error: qualified name does not name a class before '{' token 

Редактировать Просто, чтобы сделать это более легко видно, как указано ниже в комментариях: Это требование является необычным. Это часть нового исследовательского проекта в области аппаратного моделирования, над которым я работаю. Testbench написан на C++, и я хочу отображать переменные в форме волны. Я исследовал различные другие варианты и понял, что мне нужно использовать класс друзей, из-за практических соображений. Друг захватит значения и сформирует форму волны, но я предпочел бы иметь друга только тогда, когда требуется форма волны, и не все время.

+2

Зачем вам это нужно? –

+0

Что вы пытаетесь достичь? – Nawaz

+0

@ K-ballo Я использую это в новом исследовательском проекте по аппаратной симуляции. Код testbench написан на C++, и я хочу предоставить новую функцию, чтобы увидеть значения переменных-членов в форме сигнала во время моделирования. Класс friend будет захватывать значения и генерировать форму волны. Я хочу, чтобы этот друг присутствовал только тогда, когда требуется форма волны, и не всегда. –

ответ

1

[class.friend]/3 говорит следующее:

друг заявление, не объявить функцию должны иметь одну из следующих форм:
друг разработанную типа-спецификатор;
Друг простой тип-спецификатор;
friend typename-specifier;

поэтому нельзя условно объявить друзей класса.

На самом деле, вы можете сделать это с помощью макроса:

class Foo { 

#ifdef DECLARE_A_FRIEND 
     friend class Bar; 
#endif 
    }; 
}; 

, а затем определить или указаного макрос в качестве параметра компиляции.

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