可变参数模板中的总和类型
Sum type in variadic template
我为两种可变参数模板定义了一个模板函数:
template<typename ...A>
void foo(std::shared_future<A>... args) {
// ...
}
template<typename ...A>
void foo(std::future<A>&... args) {
// ...
}
这适用于 foo(a, b, c)
如果 a
、b
和 c
要么都是未来,要么都是共享的未来。我如何调整此代码以适用于任何两种类型模板的混合,即在这种情况下共享和原始期货?
你可以先接受任意类型 Futures...
然后使用 SFINAE 将它们限制为 std::[shared_]future
:
template<class>
struct is_future_or_shared_future : std::false_type {};
template<class T>
struct is_future_or_shared_future<std::future<T>> : std::true_type {};
template<class T>
struct is_future_or_shared_future<std::shared_future<T>> : std::true_type {};
template<class... Futures, typename = std::enable_if_t<
std::conjunction_v<is_future_or_shared_future<Futures>...>>>
void foo(Futures&... args) {
// ...
}
如果您想同时获取左值和右值,请使用转发引用:
template<class T>
using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;
template<class... Futures, typename = std::enable_if_t<
std::conjunction_v<is_future_or_shared_future<remove_cvref_t<Futures>>...>>>
void foo(Futures&&... args) {
// ...
}
要访问内部类型,您可以使用特征 class:
template<class>
struct inner_type;
template<class T>
struct inner_type<std::future<T>> {
using type = T;
};
template<class T>
struct inner_type<std::shared_future<T>> {
using type = T;
};
然后写:
typename B = std::result_of_t<
F(typename inner_type<remove_cvref_t<Futures>>::type...)>;
我为两种可变参数模板定义了一个模板函数:
template<typename ...A>
void foo(std::shared_future<A>... args) {
// ...
}
template<typename ...A>
void foo(std::future<A>&... args) {
// ...
}
这适用于 foo(a, b, c)
如果 a
、b
和 c
要么都是未来,要么都是共享的未来。我如何调整此代码以适用于任何两种类型模板的混合,即在这种情况下共享和原始期货?
你可以先接受任意类型 Futures...
然后使用 SFINAE 将它们限制为 std::[shared_]future
:
template<class>
struct is_future_or_shared_future : std::false_type {};
template<class T>
struct is_future_or_shared_future<std::future<T>> : std::true_type {};
template<class T>
struct is_future_or_shared_future<std::shared_future<T>> : std::true_type {};
template<class... Futures, typename = std::enable_if_t<
std::conjunction_v<is_future_or_shared_future<Futures>...>>>
void foo(Futures&... args) {
// ...
}
如果您想同时获取左值和右值,请使用转发引用:
template<class T>
using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<T>>;
template<class... Futures, typename = std::enable_if_t<
std::conjunction_v<is_future_or_shared_future<remove_cvref_t<Futures>>...>>>
void foo(Futures&&... args) {
// ...
}
要访问内部类型,您可以使用特征 class:
template<class>
struct inner_type;
template<class T>
struct inner_type<std::future<T>> {
using type = T;
};
template<class T>
struct inner_type<std::shared_future<T>> {
using type = T;
};
然后写:
typename B = std::result_of_t<
F(typename inner_type<remove_cvref_t<Futures>>::type...)>;