0

我写了以下代码:

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如果有模板参数怎么办?

4

0 回答 0