[英]How to template specialize a function based on member variable existence
这是我想要的一个简单示例,但我不知道如何使这些功能明确无误。 我正在使用 echo 来检查 SFINAE 的成员变量类型的完整性,并使用 echo back void 作为返回类型。
// Example program
#include <iostream>
#include <string>
#include <type_traits>
namespace detail {
struct X {
int x;
};
struct Y {
int y;
};
template <typename V, typename... T>
using echo = V;
template <typename T>
echo<void, decltype(std::declval<T>().x)> template_print(T& t) {
std::cout << "x = " << t.x << std::endl;
}
template <typename T>
echo<void, decltype(std::declval<T>().y)> template_print(T& t) {
std::cout << "y = " << t.y << std::endl;
}
}
int main()
{
detail::X a{.x = 1};
detail::Y b{.y = 2};
detail::template_print(a);
detail::template_print(b);
return 0;
}
我不认为这是一个含糊不清的问题,而是一个重新定义的问题。
如果您将echo
别名模板的实现从“直接”更改为“间接”,则可以解决您遇到的问题,如以下代码片段所示。
template <typename T, typename... Ts>
struct Echo
{
using type = T;
};
template <typename T, typename... Ts>
using echo = typename Echo<T, Ts...>::type;
请注意,有些人可能会建议您使用std::void_t
,但这在这里也行不通 - 出于完全相同的原因。
这个问题有点复杂,但您可以通过使用间接别名模板(如上面最终解析为嵌套类型的模板)而不是直接别名模板来避免它。
冒着让我自己说话的风险,我唯一看到过对此的任何解释的地方是这个CppCon 2021 视频的第一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.