0

Есть ли в С++ способ при написании кода ограничить доступ к некоторым функциям класса? Чтобы в каком-нибудь IDE в одном случае в подсказке предлагался, скажем, только f1, а f2 и f3 нельзя бы было использовать. А в другом случае (например, класс шаблонный, и в этом другом случае шаблоном передан другой тип данных) "подсказывались" бы все три метода. Т.е. позволит ли С++ перегрузить конкретный шаблон класса

template <typename T>
class Test
{
public:
    void f1();
    void f2();
    void f3();
}

чтобы, например, при написании в коде

Test<int>().

IDE предлагал в подсказке все три метода, а при

Test<double>().

открыт был бы только f1? Чтобы f2 и f3 не отображались в подсказке. Возможно, есть способ решения без использования шаблонов?

NaN
  • 185
  • 1
    Вас это только с точки зрения IDE волнует? – Kromster Jul 16 '19 at 12:16
  • Язык программы - С++ – NaN Jul 16 '19 at 12:40
  • Можно попробовать спрятать через #define например #define hide1(a) a а потом Type1 hide1(func1)() в borland работает, а в студии незнаю. – nick_n_a Jul 16 '19 at 12:43
  • А... недочитал... ещё два случая сделать... круто. Да с++ это может сделать, только через #define #ifdef #else #end изучайте директивы предпроцессора - и творите чудеса (если ваши со-служивцы не обидятся). Если команда из одного человека - вас - то не вижу в этом смысла. Используя ООП - такие чудеса сделать не получится. – nick_n_a Jul 16 '19 at 12:46
  • 4
    Что понимается под выражениями "в одном случае" и "при других параметрах"? – V-Mor Jul 16 '19 at 12:50
  • Возможно вам нужно почитать основы с++ https://ru.stackoverflow.com/questions/454263/%d0%9a%d0%bd%d0%b8%d0%b3%d0%b8-%d0%b8-%d1%83%d1%87%d0%b5%d0%b1%d0%bd%d1%8b%d0%b5-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d1%8b-%d0%bf%d0%be-%d0%a1 Может вам не хватает friend-функции/класса. Может вам нужно template. – nick_n_a Jul 16 '19 at 12:53
  • 3
    Не очень хорошо обьяснили что хотите. Или поясните получше или приведите пример – AR Hovsepyan Jul 16 '19 at 12:54
  • 1
    Непонятно, что именно нужно, и вообще - вам нужны шашечки или ехать? в смысле - именно в среде чтоб видно не было, или в программе?... – Harry Jul 16 '19 at 13:07
  • NaN, ну и зачем вы откатили мою правку с нормальным названием и метками? – Kromster Jul 17 '19 at 06:06
  • @V-Mor, вопрос обновлен – NaN Jul 17 '19 at 06:23
  • @Kromster Откатил потому, что подумал, это я что-то стёр по ошибке. И второй вопрос также создал по ошибке: ещё не освоил все возможности сайта. Прошу прощения, вопрос был удалён – NaN Jul 17 '19 at 06:24
  • @nick_n_a Да, директивы - это хорошо, только они работают при компиляции, а в данном случае необходима удобная работа с классом в процессе написания кода. Friend может подойти – NaN Jul 17 '19 at 06:27

2 Answers2

2

Если я все правильно понял, то

//.h
class Class
{
public:
    Type1 func1();
    Type2 func2();
#ifdef USE_FUNC3
    Type3 func3();
#endif

};

//.cpp
#ifdef USE_FUNC3
Type3 Class::func3()
{
    //TODO: place your code here
}
#endif
...

Далее следует определять или не определять USE_FUNC3. В некоторых IDE это можно сделать в настройках проекта, например в qt creator можно установить DEFINES += USE_FUNC3 в файле .pro.

Другой вариант, это завести файл project_settings.h и в нем добавить строчку:

//use this to enable func3()
#define USE_FUN3

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

asianirish
  • 2,864
1

Для этого есть специализации шаблонов, т.е. в каждой специализации (если нужно) будет свой набор функций.

template <typename T>
class Test
{
public:
    void f1();
    void f2();
    void f3();
}

template <>
class Test<double>
{
public:
    void f1();
}

Даст на выходе то, что Вы и просили: только один метод для специализации double и три метода для всех других.

Единственная загвоздка здесь — повторение кода функции f1. Этого можно избежать вынеся код в какую-нибудь общую сущность и вызывая общую реализацию оттуда. Варианты могут быть разные: наследование от общего класса, свободная функция, некоторый объект, который используется внутри класса и т.д.

ixSci
  • 23,825
  • Можно чуть конкретнее насчёт вариантов? общий класс используется на ура, а перегруженный вариант, использующий одно и то же определение метода, что и общий, при использовании этого метода выдаёт unresolved external symbol – NaN Jul 22 '19 at 10:02
  • @NaN, лучше задайте отдельный вопрос по конкретной проблеме. В комментариях подобное разбирать сложно, да и людей больше увидит, что у Вас там не получается. – ixSci Jul 22 '19 at 10:10