Giả sử tôi có một hàm mẫu:
template <typename A, typename B>
A fancy_cast(B)
{
return {};
}
Việc sử dụng dự định là một cái gì đó như fancy_cast<int>(1.f).
Nhưng không có gì ngăn người dùng chỉ định tham số mẫu thứ hai theo cách thủ công : fancy_cast<int, int>(1.f), điều này sẽ gây ra sự cố.
Làm thế nào tôi có thể ngăn chặn typename Bđược chỉ định và buộc nó được suy luận?
Tôi đã nghĩ ra điều này:
// Using this wrapper prevents the code from being
// ill-formed NDR due to [temp.res]/8.3
template <auto V> inline constexpr auto constant_value = V;
template <
typename A,
typename ...Dummy,
typename B,
typename = std::enable_if_t<constant_value<sizeof...(Dummy)> == 0>
>
A fancy_cast(B)
{
return {};
}
Nó xuất hiện để làm việc, nhưng nó cực kỳ cồng kềnh. Có cách nào tốt hơn?
AvàB? Tôi không thấy lý do tại sao nó sẽ không.