Шаблоны С++: подскажите аргументы шаблона компилятору?

У меня есть следующее определение класса:

template<std::size_t N>
class Vector {
public:
    template<typename T>
    Vector(std::enable_if<is_foreach_iterator<T>, T>::type& it_begin, T& _end) {
        // At this point I can't figure out how to tell the compiler
        // that N = std::distance(it_begin, it_end)
    }
}

Есть ли способ, которым я могу как-то намекнуть на это компилятору (и подтвердить неправильные входные данные?)


person WorldSEnder    schedule 25.06.2014    source источник
comment
Компилятор не может этого знать, потому что параметры передаются во время выполнения. Вы всегда можете использовать assert для утверждений во время выполнения.   -  person chris    schedule 26.06.2014


Ответы (1)


Обновление К комментариям: Прямой эфир на Coliru< /сильный>

#include <vector>

template <typename... Args>
    void foo(Args... args)
{
    static_assert(sizeof...(Args) == 7, "unexpected number of arguments");
    std::vector<int> v { args... };
}


int main(int argc, char* argv[])
{
    foo(1,2,3,4,5,6,7);
    foo(1,2,3,4,5,6,7,8); // oops
}

Вы не можете проверить во время компиляции, поэтому утверждение в порядке

#include <cassert>

template<std::size_t N>
class Vector {
public:
    template<typename T>
    Vector(std::enable_if<is_foreach_iterator<T>, T>::type& it_begin, T& _end) {
        assert(N == std::distance(it_begin, it_end));
    }
}

или, если вы предпочитаете

#include <stdexcept>

template<std::size_t N>
class Vector {
public:
    template<typename T>
    Vector(std::enable_if<is_foreach_iterator<T>, T>::type& it_begin, T& _end) {
        if(N != std::distance(it_begin, it_end))
           throw std::range_error();
    }
}
person sehe    schedule 25.06.2014
comment
Есть ли способ сообщить компилятору, что N = sizeof...(args)? Я бы хотел что-то вроде Vector(int&... args){n = sizeof...(args);}? Это было бы константой времени компиляции, но я не могу понять, как это сделать. - person WorldSEnder; 26.06.2014
comment
Вы можете использовать это, если у вас есть вариативный аргумент (да, он будет проверен во время компиляции). Но в вашем коде этого нет. Обновленный ответ: Жить на Coliru - person sehe; 26.06.2014