Ошибка компиляции для std :: is_same Применение - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь использовать std :: is_same :: value в коде моего приложения. Ниже приведен пример кода, который я написал, чтобы воссоздать код моего приложения. Но я получаю ниже ошибку компилятора:

ошибка: нет соответствующей функции для вызова 'Y :: getName (bool &, bool &)'

Файл объявления:

class X {
    std::string getName(bool a = false, bool b = false) { ... } 
};

class Y {
    std::string getName(bool a = false) { ... }
};

template<typename T>
std::string getMyName(const T &obj, bool a = false, bool b = false);

Файл приложения:

template<typename T>
std::string getMyName(const T &obj, bool a, bool b)
{
    if (std::is_same<T, X>::value)
        return obj->getName(a, b);
    else
        return obj->getName(a);
}

void callerFunc()
{
    ...
    ...
    // X and Y are of pointer types 
    std::string strY = getMyName<Y>(y, true);
    std::string strX = getMyName<X>(x, true, true);
}

Я использую C ++ 11 и не могу использовать более поздние версии. Пожалуйста, сообщите, если что-то не так с моим использованием.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Может быть лучшим вариантом будет перегрузить эту функцию-получатель для другого числа аргументов, чтобы вы могли вызывать ее напрямую, без необходимости использовать std::is_same:

struct X {
    std::string getName(bool a, bool b);
    std::string getName(bool a) { return getName(a, false); }
    std::string getName() { return getName(false, false); }
};

struct Y {
    std::string getName(bool a);
    std::string getName() { return getName(false); }
};

Или иметь разные функции получения для различных поведений с 0 аргументами.

0 голосов
/ 04 мая 2020

Функция должна быть скомпилирована как единое целое (даже если одна ветвь никогда не используется). Единственное исключение из этого правила - использование C ++ 17 if constexpr - оно условно отключает компиляцию части функции.

Однако вы можете использовать простую перегрузку.

std::string getMyName(const X &obj, bool a, bool b)
{
        return obj->getName(a, b);
}

template<typename T>
std::string getMyName(const T &obj, bool a)
{
        return obj->getName(a);
}

Затем вам нужно разрешить вашему компилятору определять тип шаблона, а не предоставлять его (в противном случае компилятор не сможет выбрать не шаблонную перегрузку). Если аргументы шаблона функции используются в качестве аргументов функции, вам не нужно явно указывать этот тип в <>. Вы можете добавить его обратно для функции, которая должна использовать шаблон, но вы не должны добавлять его для функции, которая должна использовать X класс.

void callerFunc()
{
    ...
    ...
    // X and Y are of pointer types 
    std::string strY = getMyName(y, true);
    std::string strX = getMyName(x, true, true);
}

Просмотреть его онлайн (с некоторыми изменениями в сделать компиляцию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...