0x00 | 代码示例
#include <iostream>
#include <type_traits>
#include <concepts>
template <typename T, typename... Args> constexpr bool any_same()
{
if constexpr (sizeof...(Args) == 0)
return false;
else
return (std::same_as<std::remove_reference_t<T>, Args> || ...) || any_same<Args...>();
}
template <typename T>
concept myConcept = any_same<T, int, float, char>();
template <myConcept T>
void foo(T t)
{
using U = std::remove_cvref_t<T>;
if constexpr (std::is_same<U, int>::value)
std::cout << "int: " << t << std::endl;
else if constexpr (std::is_same<U, float>::value)
std::cout << "float: " << t << std::endl;
else if constexpr (std::is_same<U, char>::value)
std::cout << "char: " << t << std::endl;
}
int main()
{
foo(111);
foo(2.22f);
foo('a');
return 0;
}
0x01 | 说明
这段代码中的Concepts部分是我和一位朋友,以及chatGPT所共同讨论出的结果,虽然我们似乎都不太明白递归部分是怎么工作的。
这段代码使用了C++20的Concepts特性,结合constexpr以及type_traits在编译期递归地检查所给类型中是否有重复,即检测任意个类型中是否有相同。
似乎在做一些根据参数类型进行的跳转时还是有一定用处的,虽然牺牲了二进制大小以及编译时间,仅仅换来了一点微小的性能提升。