C++ Наследование, Инкапсуляция, Шаблоны

106
10 апреля 2021, 15:20

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

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

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

Test<int>().

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

Test<double>().

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

Answer 1

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

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

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

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

Answer 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

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

READ ALSO
Что лучше передавать значение числа или адрес? [дубликат]

Что лучше передавать значение числа или адрес? [дубликат]

Что лучше (по скорости) передавать значение числа или адрес 4хбайтного числа?

97
Как сделать адаптивность сайта?

Как сделать адаптивность сайта?

Проблема с адаптивностью сайтаЯ новичок, поэтому не особо разбираюсь как правильно писать адаптивность

142