gpt4 book ai didi

c++ - 使用部分模板特化来选择基类

转载 作者:行者123 更新时间:2023-11-30 05:28:46 25 4
gpt4 key购买 nike

我对下面尝试使用的一些高级模板技术不熟悉,所以我怀疑我的术语可能不太正确。我有一个 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();

我尝试专攻Boxstd::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/

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