作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在json.h中我有:
template <class T>
Json::Value write_json(const T& object);
在json.cpp中:
template <>
Json::Value write_json(const bool& object) {
Json::Value output;
output = object;
return output;
};
template <>
Json::Value write_json(const int& object) {
Json::Value output;
output = object;
return output;
};
template <>
Json::Value write_json(const std::vector<bool>& v) {
Json::Value output;
for (auto it = v.begin(); it != v.end(); ++it) { output.append(*it); };
return output;
};
template <>
Json::Value write_json(const std::vector<int>& v) {
Json::Value output;
for (auto it = v.begin(); it != v.end(); ++it) { output.append(*it); };
return output;
};
在C++中是否有任何方法可以在一个“子模板”上专门化基本类型,在另一个“子模板”上专门化容器?
最佳答案
让我们从特征开始检查您是否正在获取容器:
template<class ...>
using void_t = void;
template<class T, class = void>
struct is_container : std::false_type{};
template<class T>
struct is_container<T, void_t<decltype(std::begin(std::declval<T>())), decltype(std::end(std::declval<T>()))>> : std::true_type{};
template<class T>
constexpr auto is_container_v = is_containter<T>::value;
这样你就可以这样做:
template <class T>
Json::Value write_json_primitive(const T& object) {
static_assert(!is_container_v<T>);
Json::Value output;
output = object;
return output;
};
template <class T>
Json::Value write_json_container(const T& v) {
static_assert(is_container_v<T>);
Json::Value output;
for (const auto& val : v) { output.append(val); };
return output;
};
template <class T>
Json::Value write_json(const T& object) {
if constexpr (is_container_v<T>)
return write_json_container(object);
else
return write_json_primitive(object);
}
旁注:此代码需要 C++17 支持。如果您明确需要 C++11,可以这样做,但有点不同
这里需要更多的元编程,并且 static_asserts
不能那么容易使用,但我仍然做到了:
template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
template<class T, class = void>
struct is_container : std::false_type{};
template<class T>
struct is_container<T, void_t<decltype(std::begin(std::declval<T>())), decltype(std::end(std::declval<T>()))>> : std::true_type{};
template <class T>
Json::Value write_json_primitive(const T& object) {
Json::Value output;
output = object;
return output;
};
template <class T>
Json::Value write_json_container(const T& v) {
Json::Value output;
for (const auto& val : v) { output.append(val); };
return output;
};
template<class T>
using json_function = std::conditional<
is_container<T>::value,
std::integral_constant<decltype(&write_json_container<T>), &write_json_container<T>>,
std::integral_constant<decltype(&write_json_primitive<T>), &write_json_primitive<T>>>;
template <class T>
Json::Value write_json(const T& object) {
return json_function<T>::type::value(object);
}
希望这会像魅力一样发挥作用;)
关于子模板中的 C++ 模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58337609/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!