我有两个具有不同返回值的函数,我想在不使用宏或继承的情况下动态更改,应该使用哪个函数。
在下面的示例中,我想启用函数的整数变量并禁用浮动变量:
#include <iostream>
#include <type_traits>
constexpr bool int_en = true;
template<std::enable_if_t<int_en, bool> = false>
int test(void) noexcept {
return 10;
}
template<std::enable_if_t<!int_en, bool> = false>
float test(void) noexcept {
return 10.;
}
int main(void) {
std::cout << test();
}
我已经尝试了几个程序的变体,即使使用std :: conditional它也不起作用:
#include <iostream>
#include <type_traits>
constexpr bool int_en = true;
using ret_t = typename std::conditional<int_en, int, float>::type;
template<std::enable_if_t<std::is_same<int, ret_t>::value, bool> = false>
ret_t test(void) noexcept {
return 10;
}
template<std::enable_if_t<std::is_same<float, ret_t>::value, bool> = false>
ret_t test(void) noexcept {
return 10.;
}
int main(void) {
std::cout << test();
}
我总是得到同样的错误:
/usr/include/c++/7/type_traits: In substitution of ‘template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = false; _Tp = bool]’:
tmp5.cpp:11:40: required from here
/usr/include/c++/7/type_traits:2476:61: error: no type named ‘type’ in ‘struct std::enable_if<false, bool>’
using enable_if_t = typename enable_if<_Cond, _Tp>::type;
我应该怎么做才能让它发挥作用? 我正在使用g ++ 7.3和C ++ 17。
答案 0 :(得分:2)
您可以使用enable_if_t
计算返回类型,如(在c ++ 14中使用,对{c + 11使用enable_if
):
#include <iostream>
#include <type_traits>
constexpr bool int_en = true;
template <bool b = int_en>
std::enable_if_t<b, int>
test(void) noexcept {
return 10;
}
template <bool b = int_en>
std::enable_if_t<!b, float>
test(void) noexcept {
return 10.4;
}
int main(void) {
std::cout << test();
}
答案 1 :(得分:1)
我最终成功使用了Constructor注释中的提示:
#include <iostream>
#include <type_traits>
constexpr bool int_en = false;
using ret_t = typename std::conditional<int_en, int, float>::type;
ret_t test(void) noexcept {
if constexpr(int_en) {
return 10;
} else {
return 10.;
}
}
int main(void) {
std::cout << test();
}