C ++:使用type-trait启用不同返回类型的函数

时间:2018-04-07 11:40:12

标签: c++ templates c++17

我有两个具有不同返回值的函数,我想在不使用宏或继承的情况下动态更改,应该使用哪个函数。

在下面的示例中,我想启用函数的整数变量并禁用浮动变量:

#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。

2 个答案:

答案 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();
}