gpt4 book ai didi

c++ - std::enable_if 具有多个 or 条件

转载 作者:行者123 更新时间:2023-12-05 08:46:53 27 4
gpt4 key购买 nike

我正在努力寻找允许多个 OR'ed std::enable_if 的正确语法我的模板函数的条件。

#include <type_traits>

template <typename T>
using Foo = std::enable_if_t<std::is_same_v<T, int>>;

template <typename T>
using Bar = std::enable_if_t<std::is_same_v<T, float>>;

// Fine - accepts only ints
template <typename T, typename = Foo<T>>
void FooIt(T t) {}

// Fine - accepts only floats
template <typename T, typename = Bar<T>>
void BarIt(T t) {}

template <typename T,
// This does not work
typename = std::enable_if_t<Bar<T>::value || Foo<T>::value>>
void FooOrBarIt(T t) {}

int main() {
FooIt(1);
BarIt(1.0f);

// FooIt(1.0f); // OK - No float version of FooIt
// BarIt(1); // OK - No int version of BarIt

// Not OK - Both fails to compile
// FooOrBarIt(1);
// FooOrBarIt(1.0f);
}

我想要 FooOrBarIt函数同时接受 int s 和 float s 但没有别的通过组合前面的 FooBar条件。

请注意,我想避免改变之前的条件,我想按原样组合它们。任何 C++17 都可以。

当前代码失败并出现如下编译错误:

candidate template ignored: requirement 'std::is_same_v<int, float>' was not satisfied [with T = int]

在 clang 中。

最佳答案

您正在尝试在 enable_if_t 内部使用 enable_if_t,这不是您需要的。您需要在 1 enable_if_t 中使用 is_same_v,例如:

template <typename T,
typename = std::enable_if_t<std::is_same_v<T,float> || std::is_same_v<T,int>>>

因此请相应地调整您的using 语句,例如:

#include <type_traits>

template <typename T>
inline constexpr bool Is_Int = std::is_same_v<T, int>;

template <typename T>
using Enable_If_Int = std::enable_if_t<Is_Int<T>>;

template <typename T>
inline constexpr bool Is_Float = std::is_same_v<T, float>;

template <typename T>
using Enable_If_Float = std::enable_if_t<Is_Float<T>>;

// Fine - accepts only ints
template <typename T, typename = Enable_If_Int<T>>
void FooIt(T t) {}

// Fine - accepts only floats
template <typename T, typename = Enable_If_Float<T>>
void BarIt(T t) {}

template <typename T,
typename = std::enable_if_t<Is_Float<T> || Is_Int<T>>>
void FooOrBarIt(T t) {}

int main() {
FooIt(1);
BarIt(1.0f);

// FooIt(1.0f); // OK - No float version of FooIt
// BarIt(1); // OK - No int version of BarIt

// OK - Both compile fine
FooOrBarIt(1);
FooOrBarIt(1.0f);
}

Online Demo

关于c++ - std::enable_if 具有多个 or 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68774638/

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