具有默认模板参数的参数包
Parameter pack with default template argument
在此代码中,我试图将 Test
从使用 Arg
概括为使用 Args...
。问题是默认模板参数。我在下面编译的内容,除非我取消注释 main():
中的注释行
#include <iostream>
#include <type_traits>
struct A {
void foo(int) const {}
void foo(int, bool, char) const {}
};
template <typename...> struct voider { using type = void; };
template <typename... Ts>
using void_t = typename voider<Ts...>::type;
template <typename T, typename Arg, typename = void_t<T>>
struct Test : std::false_type {};
template <typename T, typename Arg>
struct Test<T, Arg, void_t<decltype(std::declval<T&>().foo(std::declval<Arg>()))>> :
std::true_type {};
// Trying to generalize Test with Args... instead of Arg
template <typename T, typename, typename... Args> struct Check;
template <typename T, typename... Args>
struct Check<T, void_t<T>, Args...> : std::false_type {};
template <typename T, typename... Args>
struct Check<T, void_t<decltype(std::declval<T&>().foo(std::declval<Args>()...))>, Args...>
: std::true_type {};
template <typename T, typename... Args>
using CheckArgs = Check<T, void_t<T>, Args...>;
int main() {
std::cout << std::boolalpha << Test<A, int>::value << '\n'; // true
// std::cout << CheckArgs<A, int, bool, char>::value << '\n'; // ambiguous
}
main() 中的最后一行有歧义。首先,为什么它是模棱两可的,而 main() 中的第一行却不是?其次,如何修复代码以便 main 中的最后一行能够编译(它应该计算为真,因为 int、bool、char 是 A::foo 的参数)?
你想要
template <typename T, typename, typename... Args>
struct Check : std::false_type {};
template <typename T, typename... Args>
struct Check<T, void_t<decltype(std::declval<T&>().foo(std::declval<Args>()...))>, Args...>
: std::true_type {};
您希望主模板提供默认大小写 - 这是错误的,而部分专业化提供真实大小写。当你写两个部分特化时,两者都是可行的,并且两者之间没有顺序,所以它最终变得模棱两可
这只是重新实现了 std::experimental::is_detected
的更受限版本。
在此代码中,我试图将 Test
从使用 Arg
概括为使用 Args...
。问题是默认模板参数。我在下面编译的内容,除非我取消注释 main():
#include <iostream>
#include <type_traits>
struct A {
void foo(int) const {}
void foo(int, bool, char) const {}
};
template <typename...> struct voider { using type = void; };
template <typename... Ts>
using void_t = typename voider<Ts...>::type;
template <typename T, typename Arg, typename = void_t<T>>
struct Test : std::false_type {};
template <typename T, typename Arg>
struct Test<T, Arg, void_t<decltype(std::declval<T&>().foo(std::declval<Arg>()))>> :
std::true_type {};
// Trying to generalize Test with Args... instead of Arg
template <typename T, typename, typename... Args> struct Check;
template <typename T, typename... Args>
struct Check<T, void_t<T>, Args...> : std::false_type {};
template <typename T, typename... Args>
struct Check<T, void_t<decltype(std::declval<T&>().foo(std::declval<Args>()...))>, Args...>
: std::true_type {};
template <typename T, typename... Args>
using CheckArgs = Check<T, void_t<T>, Args...>;
int main() {
std::cout << std::boolalpha << Test<A, int>::value << '\n'; // true
// std::cout << CheckArgs<A, int, bool, char>::value << '\n'; // ambiguous
}
main() 中的最后一行有歧义。首先,为什么它是模棱两可的,而 main() 中的第一行却不是?其次,如何修复代码以便 main 中的最后一行能够编译(它应该计算为真,因为 int、bool、char 是 A::foo 的参数)?
你想要
template <typename T, typename, typename... Args>
struct Check : std::false_type {};
template <typename T, typename... Args>
struct Check<T, void_t<decltype(std::declval<T&>().foo(std::declval<Args>()...))>, Args...>
: std::true_type {};
您希望主模板提供默认大小写 - 这是错误的,而部分专业化提供真实大小写。当你写两个部分特化时,两者都是可行的,并且两者之间没有顺序,所以它最终变得模棱两可
这只是重新实现了 std::experimental::is_detected
的更受限版本。