Я пытаюсь создать функцию, которая принимала бы несколько аргументов заданного типа, но как тип, так и количество аргументов должны быть указаны через шаблоны.
Я обнаружил, что использование initializer_list в C++11, вероятно, является хорошей техникой в этом случае, но можно ли проверить его размер во время компиляции? Есть ли другие методы, которые могут решить эту проблему?
#include <initializer_list>
// Here I want to define type and number of components for each point
template <typename T, int DIM>
class Geometry
{
public:
void addPoint(std::initializer_list<T> coords)
{
assert(coords.size() == DIM); // Working good, but not compile-time
// Next line does not compile because size() is not known at compile-time
static_assert(coords.size() == DIM, "Wrong number of components");
}
};
addPoint
, используя синтаксис списка инициализаторов, решением будет использоватьtemplate<std::size_t N> void addPoint(const T (& coords)[N])
. Затем вы можетеstatic_assert(N == DIM, "")
в теле функции. Однако это было относительно недавно указано в черновике Стандарта (год назад), поэтому Clang пока не поддерживает его (похоже, будет в 3.8.0). Он работает в GCC (достаточно последних версиях) и Visual C++ 2015. - person bogdan   schedule 25.12.2015geo.addPoint({1.0, 2});
, я получаю следующую ошибку:mismatched types ‘double’ and ‘int’
. Шаблоны Variadic позволили мне не только проверять строгое равенство типов, но и выполнять преобразование типов. - person Dmitry Shurov   schedule 25.12.2015