[英]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.