- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对下面尝试使用的一些高级模板技术不熟悉,所以我怀疑我的术语可能不太正确。我有一个 Box
基类型和几个继承自 Box
的类.我正在尝试根据模板参数构造特定子类的实例。
这是 Box<T>
类型。 Convert
函数可以创建一个新的 Box<U>
使用返回类型 U 的函数。
template<typename T>
class Box : public std::enable_shared_from_this<Box<T>> {
public:
// Box<T> --> Box<U>
template <typename Func>
auto Convert(Func f) -> std::shared_ptr<Box<decltype(f(std::declval<T>()))>>;
virtual void Print() {
std::cout << "box" << std::endl;
}
};
我可以创建一个新的 Box<int>
像这样输入:
auto box = std::shared_ptr<Box<int>>(new Box<int>());
要转换为另一种类型,我们返回类型的子类 ConvertedBox
(实际上我们这样做是因为我们懒惰地应用该函数)。
template<typename T, typename U, typename Func>
class ConvertedBox : public Box<T> {
public:
ConvertedBox(typename std::shared_ptr<Box<U>> box, Func func) :
box_(box), func_(func)
{}
virtual void Print() {
std::cout << "converted box" << std::endl;
}
private:
std::shared_ptr<Box<U>> box_;
Func func_;
};
这里还有构造子类实例的方法。
// implementation of convert
template <typename T>
template <typename Func>
auto Box<T>::Convert(Func f) -> std::shared_ptr<Box<decltype(f(std::declval<T>()))>>
{
using ReturnType = decltype(f(std::declval<T>()));
auto p = new ConvertedBox<ReturnType, T, Func>(this->shared_from_this(), f);
return std::shared_ptr<Box<ReturnType>>(p);
}
现在我可以构造一个新的 Box<U>
使用如下调用:
auto converted_float_box = box->Convert([](int v) -> float {
return (float)v;
});
我希望能够做的是专门化 Box<>
基类取决于所应用的函数类型。例如,如果我转换为 Box<std::pair<int, int>>
像这样:
auto converted_pair_box = box->Convert([](int v) -> std::pair<int, int> {
return std::make_pair(v, v);
});
我希望能够在结果上调用一个函数,该函数仅适用于 Box<std::pair<K, V>>
(我在这里以打印为例。实际上,特化很复杂)。
converted_pair_box->PairOnlyPrint();
我尝试专攻Box
在 std::pair<K,V>
上, 但没有运气。
template<typename K, typename V>
class PairBox : public Box<std::pair<K, V>> {
public:
void PairOnlyPrint() {
std::cout << "only pair box" << std::endl;
};
};
编译器仍在解析为 Box<>
所以 PairOnlyPrint
不可用。是否有实现此目的的方法?
编辑 1:如前所述,Convert
不是免费功能。
最佳答案
您的 class PairBox
不是特化,特化是:
template<typename K, typename V>
class Box<std::pair<K, V>>: public std::enable_shared_from_this<Box<std::pair<K, V>>> {
public:
// Box<T> --> Box<U>
template <typename Func>
auto Convert(Func f)
-> std::shared_ptr<Box<decltype(f(std::declval<std::pair<K, V>>()))>>;
virtual void Print() { std::cout << "pair box" << std::endl; }
void PairOnlyPrint() { std::cout << "only pair box" << std::endl; };
};
关于c++ - 使用部分模板特化来选择基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36657164/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!