gpt4 book ai didi

c++ - 是否可以将 'enable_if' 和 'is_same' 与可变函数模板一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:33 24 4
gpt4 key购买 nike

这两个非可变函数模板编译:

template <typename T, typename U>
typename std::enable_if<std::is_same<U, int>::value, void>::
type testFunction(T a, U b) {
std::cout << "b is integer\n";
}

template <typename T, typename U>
typename std::enable_if<std::is_same<U, float>::value, void>::
type testFunction(T a, U b) {
std::cout << "b is float\n";
}

但是,类似的可变参数模板无法编译:

template <typename T, typename... U>
typename std::enable_if<std::is_same<U, int>::value, void>::
type testFunction(T a, U... bs) {
std::cout << "bs are integers\n";
}

template <typename T, typename... U>
typename std::enable_if<std::is_same<U, float>::value, void>::
type testFunction(T a, U... bs) {
std::cout << "bs are floats\n";
}

也许我正在尝试做一些无法完成的事情。我知道使用初始化列表可以实现类似的功能,但我想避免初始化列表参数所需的大括号。

最佳答案

是的。您可以使用 fold expression在 C++17 中:

template <typename T, typename... U>
typename std::enable_if<(std::is_same<U, float>::value && ...), void>::
type testFunction(T a, U... bs) {
std::cout << "bs are floats\n";
}

在 C++11 中,您可以重新实现 std::conjunction :

template<class...> struct conjunction : std::true_type { };
template<class B1> struct conjunction<B1> : B1 { };
template<class B1, class... Bn>
struct conjunction<B1, Bn...>
: std::conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};

template <typename T, typename... U>
typename std::enable_if<
std::conjunction_v<std::is_same<U, float>...>,
void
>::type testFunction(T a, U... bs) {
std::cout << "bs are floats\n";
}

关于c++ - 是否可以将 'enable_if' 和 'is_same' 与可变函数模板一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48764158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com