Я столкнулся с чем-то, чего я не могу понять и не нашел способ нормально работать. То, что я пытаюсь достичь, выглядит относительно просто: я хочу сравнить некоторые данные.Выбросы шаблонов Variadic
Лучший способ описать бы строка кода:
std::tuple<const char *, int, const char *, int> my_data =
std::make_tuple("hello", 13, "world", 37);
// Now I want to compare my_data againt some known value.
assert(Test::entry(my_data, "hello", 13, "world", 37));
Я использую кортеж ради примера. В моем случае эти данные поступают из объекта сообщения и извлекаются с использованием operator>>
. Однако это не связано с проблемой.
Вот минималистский код, иллюстрирующий проблему.
#include <cstring>
using MyTuple = std::tuple<const char *, int, const char *, int>;
namespace Test
{
// called when we are done
bool extract(MyTuple source)
{
return true;
}
template<typename T,
typename ...Content>
bool extract(MyTuple source, T data, Content... content)
{
if (std::is_same<const char *, T>::value)
assert(0); // why ? :(
std::cout << "Generic: " << data << std::endl;
return extract(source, content...);
}
template<typename ...Content>
bool extract(MyTuple source, const char *str, Content... content)
{
std::cout << "Overloaded: " << str << std::endl;
return extract(source, content...);
}
template<typename ...Content>
bool entry(const std::tuple<const char *, int, const char *, int> &data,
Content... content)
{
return extract(data, content...);
}
};
Я бы нормально выполнять comparaison в extract()
функций, но и для поддержания пример простой, я удалил их.
То, что я хочу достичь, является правильной отправкой. На примере это мое понимание того, что называют порядок должен быть:
- перегружен
const char *
- Generic
- перегрузки для
const char *
- Generic
Однако, выхода из этого теста Программа представляет собой:
- Перегружен: привет
- Генеральный директор: 13
Assertion failed
. Тестstd::is_same
запускаетassert
.
Я обнаружил, что перегрузка const char *
не будет вызываться после того, как общая перегрузка была вызвана один раз.
У меня пропало что-то?
РЕДАКТИРОВАТЬ: Также не так, если я определяю перегрузку const char *
перед общей функцией, это обыкновение даже компилировать.
Немного глупо использовать 'std :: make_tuple', когда вы уже знаете тип кортежа, который вы хотите - вся точка' make_tuple' должна выводить тип кортежа из типов инициализаторов. Вы можете просто использовать 'std :: tuple my_data {" hello ", 13," world ", 37};' –
Casey
@Casey Да, это было только для иллюстрации моего проблема. Мой источник данных - это сокет, из которого я извлекаю материал. – Xaqq