gpt4 book ai didi

c++ - 我可以简化以下模板吗?

转载 作者:行者123 更新时间:2023-11-30 02:38:03 25 4
gpt4 key购买 nike

编辑:

感谢您的出色回答。我显然没有对我的问题提供足够的细节。我试图纠正这个问题:

我正在更新一些遗留代码,并且有几个具有以下模式的重载函数:

void foo (Int bla, const char* bla1, const char* bla2, ...);
void foo (Int bla, SomeCustomContainer);

现在,我们正在逐步淘汰自定义容器,改用标准容器。自定义容器的签名使得我可以在容器上做模板,重新使用代码,同时支持遗留代码和新代码,直到遗留代码被淘汰。

我的第一次尝试是:

template <typename ContainerT> void foo(int bla, ContainerT);

但是编译器吐出一个错误,因为它通过 const char* 签名匹配模板函数。

根据 StackOverflow 上的回答,我尝试了以下模板签名:

template <typename ValT, template <typename, typename = std::allocator<ValT> >
class ContainerT>
void foo(Int bla, const ContainerT<ValT>& rasInParams)

这解决了我的问题——编译器找到了正确的重载并且一切正常以达到我的目的。我唯一的提示是,对于一个不太喜欢模板的同事来说,要解析的东西太多了,我想知道是否有办法简化这个——我在考虑类型别名,但也许有人知道解决我的潜在重载解析问题的更好方法?

最佳答案

该示例不能正常工作(想象一个容器不采用分配器,或者采用两个以上的类型参数,或者,上帝保佑,非类型参数)。

我通常的做法是

template <typename Container>
void foo(const ContainerT& rasInParams)

如果你需要知道值类型你可以做任何事情

typename Container::value_type

std::remove_reference<decltype(*rasInParams.begin())>::type

如果你真的需要从模板模板参数中嵌入一个可配置的容器,你可以为嵌套的一个使用可变参数签名:

template<typename ValT, template<T...> class Container>
void foo() {
Container<ValT, std::allocator<ValT> > x;
}

另一种选择是使用容器“选择器”元函数。这是例如在 Boost Graph 库中使用:

关于c++ - 我可以简化以下模板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31156453/

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