Ответ 1
Для ограничения количества аргументов вы можете легко проверить, есть ли sizeof...(Args) == N
, но для проверки того, что все аргументы удваиваются, вам нужно построить рекурсивный тип, который проверяет std::is_same
для каждого из аргументов.
template<typename...>
struct are_same : std::true_type
{};
template<typename T>
struct are_same<T> : std::true_type
{};
template<typename T, typename U, typename... Types>
struct are_same<T, U, Types...> :
std::integral_constant<bool, (std::is_same<T, U>::value && are_same<T, Types...>::value)>
{};
Уведомление are_same
сначала объявлено, а затем специализировано.
Затем просто примените ограничение в возвращаемом типе метода с помощью std::enable_if
, воспользовавшись SFINAE.
template <unsigned int N> class myclass
{
public:
template <typename... Args>
typename std::enable_if<(are_same<double, Args...>::value && sizeof...(Args) == N), void>::type
/* void */ mymethod(Args... args)
{
// Do interesting stuff
}
};