У меня есть следующий пример, в котором используются два параметра t1 и t2.Функция шаблона Variadic с более чем двумя параметрами
template<typename T>
bool Compare(T t1, T t2)
{
return t1 == t2;
}
template<typename T, typename... Args>
bool Compare(T t1, T t2, Args... args)
{
return (t1 == t2) && Compare(args...);
}
int main(void)
{
Compare(1, 1, "string", "string");
}
Функция сравнения принимает пары параметров одного типа и их можно сравнить. Сравнение двух пар, после чего пакет параметров передается рекурсивно до тех пор, пока не будут достигнуты последние два параметра. Чтобы остановить рекурсию, я использую реализацию функции сравнения без пакета параметров.
Я хотел бы добавить третий аргумент t3 поэтому функция сравнения должно быть таким:
template<typename T>
bool Compare(T t1, T t2, T t3)
{
return t1 == t2 == t3;
}
template<typename T, typename... Args>
bool Compare(T t1, T t2, T t3, Args... args)
{
return (t1 == t2 == t3) && Compare(args...);
}
int main(void)
{
Compare(1, 1, 1, "string", "string", "string");
}
Я ожидаю, что эта функция принимает три параметра для сравнения, то следующие три обрабатывается рекурсивно. Когда я пытаюсь скомпилировать этот код, я получить следующее сообщение об ошибке:
>xxx\source.cpp(4): error C2446: '==': no conversion from 'const char *' to 'int'
1> xxx\source.cpp(4): note: There is no context in which this conversion is possible
1> xxx\source.cpp(10): note: see reference to function template instantiation 'bool Compare<const char*>(T,T,T)' being compiled
1> with
1> [
1> T=const char *
1> ]
1> xxx\source.cpp(15): note: see reference to function template instantiation 'bool Compare<int,const char*,const char*,const char*>(T,T,T,const char *,const char *,const char *)' being compiled
1> with
1> [
1> T=int
1> ]
1>xxx\source.cpp(4): error C2040: '==': 'int' differs in levels of indirection from 'const char *'
Как реализовать эту функцию, чтобы сравнить наборы из трех параметров одного и того же типа?
Для расширения на последнюю строку: прохождение c_str() из станда строки, содержащей «строку» в качестве одного из аргументов будет оценивать ложь, даже если все строки говорят «строка» - они имеют разные места в памяти , Вы можете предпочесть использовать std-строки (которые включают в себя обертывание строковых констант в них), когда это возможно. –