Więc jestem bardzo zaznajomiony z paradygmatem testowania, jeśli istnieje funkcja członka. Obecnie ten kod działa:Testowanie, czy funkcja członkowska istnieje przy użyciu variadics
#include <iostream>
#include <type_traits>
struct has_mem_func_foo_impl {
template <typename U, U>
struct chk { };
template <typename Class, typename Arg>
static std::true_type has_foo(chk<void(Class::*)(Arg), &Class::foo>*);
template <typename, typename>
static std::false_type has_foo(...);
};
template <typename Class, typename Arg>
struct has_mem_func_foo : decltype(has_mem_func_foo_impl::template has_foo<Class,Arg>(nullptr)) { };
struct bar {
void foo(int) { }
};
int main() {
static_assert(has_mem_func_foo<bar, int>::value, "bar has foo(int)");
}
niestety jeśli zrobię lekką korektę:
#include <iostream>
#include <type_traits>
struct has_mem_func_foo_impl {
template <typename U, U>
struct chk { };
template <typename Class, typename... Arg>
static std::true_type has_foo(chk<void(Class::*)(Arg...), &Class::foo>*);
template <typename, typename...>
static std::false_type has_foo(...);
};
template <typename Class, typename... Arg>
struct has_mem_func_foo : decltype(has_mem_func_foo_impl::template has_foo<Class,Arg...>(nullptr)) { };
struct bar {
void foo(int) { }
};
int main() {
static_assert(has_mem_func_foo<bar, int>::value, "bar has foo(int)");
}
mój statyczny twierdzenie zawiedzie. Miałem wrażenie, że pakiety parametrów szablonów variadic traktowane są tak samo, gdy są rozszerzane na swoje miejsca. Zarówno gcc, jak i clang dają nieudane asercje statyczne.
Prawdziwym źródłem mojego pytania jest zatem, czy to standardowe zachowanie? Zawodzi również w przypadku testowania obecności funkcji członów z szablonem variadic.
Problem polega na tym, że kompilator nie może zagwarantować, że więcej "... Arg" nie powinno zostać wydedukowane. Przekazujesz w pierwszym 'Arg', ale musisz również sprawdzić przeciwko każdemu dodatkowemu' Arg'. Hmm. Myślę, że mam pomysł, czy to prawda. – Yakk
Rozwiązaniem jest przeniesienie 'typename ... Arg' na parametry szablonu' has_mem_func_foo_impl', [jak tutaj] (http://coliru.stacked-crooked.com/a/015c3128ced5882d) –
Zdecydowanie mogę zobaczyć, jak to się może stać , ale w tym przypadku przekazujemy pakiet parametrów jawnie 'int'. – cdacamara