我写了以下代码:
g++ -x c++ - -std=gnu++11 -Wall -Wextra -Werror -Wconversion <<__EOF && ./a && echo -e "\e[1;31mOK\e[0m" || echo -e "\e[1;31mfailed!\e[0m"
#include <functional>
#include <vector>
#include <cstdint>
template< typename T >
struct traits_type
{
typedef std::uint8_t op_type;
// ... typedefs
};
template< typename T, typename traits = traits_type< T > >
struct generator
{
typedef typename traits::op_type op_type;
// typedefs...
void operator () () const { return; }
template< typename ...OPS >
void operator () (op_type const op, OPS && ...ops)
{
sequence.push_back(op);
return operator () (std::forward< OPS >(ops)...);
}
// member functions etc...
std::vector< op_type > sequence;
};
int main()
{
struct T { }; // Some type, which does not concern us in this context.
generator< T > g;
g(0b00000000, 0b10101010);
g(0b01010101);
// ... using of g.sequence, say, in state machine
return 0;
}
__EOF
如我所愿,这段代码将允许我创建一些(所谓的)“操作码”序列。但是数字文字 as0b00000000
被视为 int。这导致了这样一个事实,即最终将较大的有符号整数类型转换为较小的无符号整数类型。它可能会产生不良的副作用。在C++中没有后缀来表示大小为一字节的无符号整数类型。如何使用纯C++11避免这种情况?我不想使用static_cast
其他的,因为这会导致代码膨胀(多个括号和至少一个符号来命名static_cast
-wrapper 函数)。解决方案可能是使用用户定义的文字,例如0b00000000_op
,看起来比o(0b00000000)
. 但 operator 必须是一个函数模板,如:
template< template T, typename traits = type_traits< T > >
constexpr
typename traits::op_type
operator "" _op (typename traits::op_type && op)
{
return std::move(op);
}
但是在C++11中没有这样的语法......T
如果有模板参数怎么办?