有条件的专业化

问题描述 投票:0回答:1

假设我有以下内容。

template<std::size_t> struct s;
template<> struct s<sizeof(int)>  { /*...*/ };
template<> struct s<sizeof(long)> { /*...*/ }; // will not compile as it already exists.

我如何实现一个检查来有条件地区分这两个实例?我只想在它们不相等的情况下实现后者。

很显然。sizeof 不是一个可以被预处理器评估的构造。我有什么选择?

c++ c++20
1个回答
1
投票

你可以让这两个专门化都采取(不受限制的)。std::size_t,并且只有在以下情况下才会启用专门化 == sizeof(int)== sizeof(long) && sizeof(long) != sizeof(int):

#include <type_traits>
#include <cstddef>

template<std::size_t, typename = void> struct s;

template<std::size_t N>
struct s<N, std::enable_if_t<N == sizeof(int)>> { /* ... */ };

template<std::size_t N>
struct s<N, std::enable_if_t<N != sizeof(int) && N == sizeof(long)>> { /* ... */ };

0
投票

如果你能保留一个 "无效 "的值,你可以用它来代替,以避免碰撞。

template<std::size_t> struct s;
template<> struct s<sizeof(int)> { /*...*/ };
template<> struct s<sizeof(long)==sizeof(int) ? -1 : sizeof(long)> { /*...*/ };

有时也可以使用 if constexpr 而不是显式的特殊化,这样的重复就不是错误。

© www.soinside.com 2019 - 2024. All rights reserved.