Несуществующее свойство спецификации шаблона - PullRequest
0 голосов
/ 17 июня 2019

Скорее всего это хорошо обсуждаемая проблема, но я просто не знаю, как правильно ее погуглить. У меня есть функция шаблона для двух спецификаций: указатель на int и vector из int s. В этой функции у меня есть параметр N , который является длиной массива int s. Если я использую vector , я хочу проверить, совпадает ли N с x.size () , поэтому мой код выглядит примерно так:

// foo.cpp
#include "foo.h"
template void foo<int *>(int *, int);
template void foo<std::vector<int>&>(std::vector<int>&>,int);
template <class T>
void foo(T x, int N){
    if ( std::is_same<T, std::vector<int>&>::value && N!=x.size() ) {
    // do something
    }
}

//foo.h
template <class T>
void foo(T x, int N);

Проблема здесь в том, что не существует метода size () для массива int s. Я сделал оператор if с оператором AND таким образом, чтобы вторая часть не вызывалась, если первая не удалась, и у меня была надежда, что компилятор мог догадаться об этом, но он все равно не скомпилировался.

Есть ли простое решение для этого? Я не хочу создавать новую функцию специально для типа vector , поскольку она полностью устраняет все причины использования шаблонов.

1 Ответ

1 голос
/ 17 июня 2019

Вы можете использовать , если constexpr (начиная с C ++ 17), чтобы отбрасывать нежелательные выражения.

Если значение равно true, то ложное утверждение отбрасывается (если имеется), в противном случае истинное утверждение отбрасывается.

template <class T>
void foo(T x, int N){
    if constexpr ( std::is_same<T, std::vector<int>&>::value ) {

        // only for T = std::vector<int>&
        if ( N!=x.size() ) {
            // do something
        }
    }
}

До C ++ 17 вам необходимо предоставить полную специализацию для T = std::vector<int>&.

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