gpt4 book ai didi

c++ - 在 VS2012 的函数签名中使用 enable_if 和 underlying_type

转载 作者:行者123 更新时间:2023-11-28 06:32:47 25 4
gpt4 key购买 nike

此代码在 VS2013 和其他编译器(已测试 clang 3.4 和 gcc 4.8)中有效,但在 VS2012 中无法编译:

#include <type_traits>
#include <cstdio>

// error C4519: default template arguments are only allowed on a class template

template<typename E, typename std::enable_if<std::is_enum<E>::value>::type* = nullptr>
typename std::underlying_type<E>::type to_integral(E e)
{
return static_cast<typename std::underlying_type<E>::type>(e);
}

template<typename E, typename std::enable_if<!std::is_enum<E>::value>::type* = nullptr>
E to_integral(E e)
{
return e;
}

enum class MyEnum : int { A = 5 };

int main()
{
auto a = to_integral(42);
auto b = to_integral(MyEnum::A);
printf("%d\n", a);
printf("%d\n", b);
}

如何在 VS2012 中编写 to_integral?是否可以?我尝试在返回参数上使用 enable_if 作为参数,但 underlying_type 出现在函数签名中,编译器往往不喜欢非枚举类型。

最佳答案

enable_if在返回类型中:

template<bool b, template<class>class X, class T>
struct invoke_if {};

template<template<class>class X, class T>
struct invoke_if<true, X, T> {
typedef typename X<T>::type type;
};

template<typename E>
typename invoke_if< std::is_enum<E>::value,std::underlying_type, E >::type
to_integral(E e) {
return static_cast<typename std::underlying_type<E>::type>(std::move(e));
}

或更简单的:

template<typename E>
typename std::enable_if< std::is_enum<E>::value,std::underlying_type<E> >::type::type
to_integral(E e) {
return static_cast<typename std::underlying_type<E>::type>(std::move(e));
}

第一次专精。对于第二个,我建议:

template<typename E>
typename std::enable_if<!std::is_enum<E>::value&&std::is_integral<E>::value,E>::type
to_integral(E e) {
return std::move(e);
}

应该在 MSVC2012 中工作 live example .注意额外的条件,以及 std::move (以防万一您有一个符合 is_integral 资格的 bigint 类)。 (通常允许在 std 中专门化这些特征)。这也意味着如果你调用to_integral(3.14)你得到一个错误,我认为这很好。

哦,还有template<bool b, class T=void>using enable_if_t=typename std::enable_if<b,T>::type;可以节省很多typename垃圾邮件(但是,对于这种事情,2012 要么缺乏支持,2013 年支持不稳定)。

关于c++ - 在 VS2012 的函数签名中使用 enable_if 和 underlying_type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27232224/

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