gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:28 25 4
gpt4 key购买 nike

鉴于以下情况:

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/

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