gpt4 book ai didi

c++ - 模板参数中的 enable_if 创建模板重新定义错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:25 31 4
gpt4 key购买 nike

this answer我真正想做的是在我的模板参数中定义一个 typename,它可以在转换 返回中使用。

所以这样:

template <typename T>
typename std::enable_if<sizeof(unsigned char) == sizeof(T), unsigned char>::type caster(T value){ return reinterpret_cast<unsigned char&>(value); }

会变成这样:

template <typename T, typename R = std::enable_if<sizeof(unsigned char) == sizeof(T), unsigned char>::type >
R caster(T value){ return reinterpret_cast<R&>(value); }

对于单个模板特化,它的工作和行为符合预期,但假设我添加了另一个特化:

template <typename T, typename R = std::enable_if<sizeof(short) == sizeof(T), short>::type>
R caster(T value){ return reinterpret_cast<R&>(value); }

现在我得到一个错误:

error C2995: 'R caster(T)' : function template has already been defined

有没有办法让编译器相信这些特化中只有一个会为任何给定调用实际构建?

最佳答案

不,没有。模板默认参数就是 defaults。任何用户都可以调用 caster<short, short> ,这将匹配两个重载。

但是,可以添加更多伪参数。

template <typename T,
typename R = typename std::enable_if<sizeof(unsigned char) == sizeof(T), unsigned char>::type >
R caster(T value) { return reinterpret_cast<R&>(value); }

template <typename T,
typename R = typename std::enable_if<sizeof(short) == sizeof(T), short>::type,
typename = void>
R caster(T value) { return reinterpret_cast<R&>(value); }

(另请注意添加的 typename 。)


但是,由于所有主体都是相同的,所以我可能不会使用重载。

template <std::size_t N>
struct cast_result;

template <>
struct cast_result<sizeof(std::uint8_t)> {
typedef std::uint8_t type;
};

template <>
struct cast_result<sizeof(std::uint16_t)> {
typedef std::uint16_t type;
};

...

template <typename T, typename R = typename cast_result<sizeof(T)>::type>
R caster(T value) {
return reinterpret_cast<R&>(value);
}

最后一点:reinterpret_cast 的使用违反了别名规则。但是,这很容易解决:

template <typename T, typename R = typename cast_result<sizeof(T)>::type>
R caster(T value) {
R result;
std::memcpy(&result, &value, sizeof result);
return result;
}

关于c++ - 模板参数中的 enable_if 创建模板重新定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28674543/

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