Я определяю некоторые черты типа следующим образом:
template <typename T>
struct has_something
{
static constexpr bool value = false;
};
template <>
struct has_something<int>
{
static constexpr bool value = true;
};
template <typename T>
constexpr bool has_something_v = has_something<T>::value;
И шаблон функции has_something_v
является требованием для параметра функции:
template <typename T, typename = std::enable_if_t<has_something_v<T>>>
void some_function(const T temp)
{
}
Когда я вызываю его с помощью неправильный тип:
struct wrong_type
{
};
void f ()
{
some_function(wrong_type());
}
компилятор дал мне правильное сообщение об ошибке:
/tmp/untitled/main.cpp:23: candidate template ignored: requirement 'has_something_v<wrong_type>' was not satisfied [with T = wrong_type]
но когда я вызвал с помощью другой функции шаблона:
template <typename ...T, typename = std::enable_if_t<has_something_v<T...>>>
void some_function(const T... args)
{
(some_function(args), ...);
}
void f ()
{
some_function(1, 2, a());
}
компилятор дает мне очень плохое и запутанное сообщение об ошибке, потому что у меня нет приемлемых характеристик пакета параметров:
Сообщение об ошибке компилятора
И если я удалю std::enable_if
из последней функции шаблона, все будет работать нормально, пока я не отправлю тип wrong_type
функции, что приведет к сбою программы.
Для пакета параметров я написал следующее:
template <typename ...T>
struct has_something
{
static bool value;
static constexpr bool c(T... args)
{
value = (args && ...);
return value;
}
};
template <>
struct has_something<int>
{
static constexpr bool value = true;
};
template <typename ...T>
const bool has_something_v = has_something<T...>::value;
Но он все равно не работает.
Как я могу написать приемлемые черты типа пакета параметров?