c++ - 消除 C++ 代码中的重复?

标签 c++ templates dry

鉴于以下情况:

StreamLogger& operator<<(const char* s) {
  elements.push_back(String(s));
  return *this;
}

StreamLogger& operator<<(int val) {
  elements.push_back(String(asString<int>(val)));
  return *this;
}

StreamLogger& operator<<(unsigned val) {
  elements.push_back(String(asString<unsigned>(val)));
  return *this;
}

StreamLogger& operator<<(size_t val) {
  elements.push_back(String(asString<size_t>(val)));
  return *this;
}

有没有办法消除重复?我想使用模板,但我只希望它用于以下类型:const char* int、unsigned 和 size_t

最佳答案

实际上,在“vanilla”C++ 中,您要么为特定类型手动编写代码,要么使用像 dirkgently 建议的那样的模板。

就是说,如果您可以使用 Boost,那么这就是您想要的:

template <class T>
StreamLogger& operator<<(T val)
{
    typedef boost::mpl::vector<const char*, int,
                                unsigned, size_t> allowed_types;

    BOOST_MPL_ASSERT_MSG(boost::mpl::contains<allowed_types, T>::value,
                            TYPE_NOT_ALLOWED, allowed_types);

    // generic implementation follows
    elements.push_back(boost::lexical_cast<std::string>(val));

    return *this;
}

如果正在编译的类型不包含在类型列表中,这将生成一个编译时错误,其中嵌入消息 TYPE_NOT_ALLOWED

另外,由于这个答案需要 Boost,所以我只使用了 lexical_cast。您会注意到您正在重复该代码,这很糟糕。考虑 wrapping将该功能转化为一个函数。


如果您不能使用 Boost,您可以使用一些类型特征很容易地模拟它:

template <typename T, typename U>
struct is_same
{
    static const bool value = false;
};

template <typename T>
struct is_same<T, T>
{
    static const bool value = true;
};

template <bool>
struct static_assert;

template <>
struct static_assert<true> {}; // only true is defined

// not the best, but it works
#define STATIC_ASSERT(x) static_assert< (x) > _static_assert_

template <class T>
StreamLogger& operator<<(T val)
{
    STATIC_ASSERT(is_same<const char*, T>::value ||
                    is_same<int, T>::value ||
                    is_same<unsigned, T>::value ||
                    is_same<size_t, T>::value);

    // generic implementation follows
    elements.push_back(boost::lexical_cast<std::string>(val));

    return *this;
}

如果断言失败,这也会产生编译时错误,尽管代码不那么性感。 :( <- 不性感

关于c++ - 消除 C++ 代码中的重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2323751/

相关文章:

c++ - XCode 4.5.2 的 CRTP 错误 - 解析问题,预期的表达式

c++ - 非类型模板参数可以实现哪些优化?

c++ - 如何从 const 方法生成非常量方法?

c++ - enable_if 似乎在类外工作但不在类内

c++ - 如何在 Linux 中读取/dev/ttyUSB0 设备?

c++ - boost 安装 : missing argument global-setup

c++ - 编译Template类时出现数百个错误(第一个Template类)

c# - 遵循 ASP.NET 中的 DRY 原则

ruby-on-rails - "Regular"Ruby gem 还是 Rails 引擎?

C++ 指针帮助缺少参数列表用户帐户::getBalance