Das*_*kie 1 c++ c++-concepts c++20
本质上,有没有Alphabet比使用一堆std::same_as/更短/更干净的定义方法std::is_same?
struct A {};
struct B {};
struct C {};
...
template <typename T>
concept Alphabet =
std::same_as<T, A> ||
std::same_as<T, B> ||
std::same_as<T, C> ||
...
Run Code Online (Sandbox Code Playgroud)
您可以通过定义基类并使用 来完成此操作(某种程度上)std::is_base_of,但为了解决这个问题,我们假设A、B、C等无法修改。
使用 Boost.Mp11,这是一个简短的单行代码:
template <typename T>
concept Alphabet = mp_contains<mp_list<A, B, C>, T>::value;
Run Code Online (Sandbox Code Playgroud)
或者可以遵循辅助概念(或辅助变量模板或辅助任何东西):
template <typename T, typename... Letters>
concept AlphabetImpl = (std::same_as<T, Letters> or ...);
template <typename T>
concept Alphabet = AlphabetImpl<T, A, B, C>;
Run Code Online (Sandbox Code Playgroud)
然而,请注意除了令人痛苦的死记硬背之外的任何其他实现:
template <typename T>
concept Alphabet = same_as<T, A> or same_as<T, B> or same_as<T, C>;
Run Code Online (Sandbox Code Playgroud)
导致包容方面的不同行为。这可能并不重要,但可能:
template <Alphabet T> void f(T); // #1
template <same_as<A> T> void f(T); // #2
f(A{}); // with the repeated same_as or same_as or ..., this calls #2
// with any other nicer implementation, ambiguous
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |