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

标签 c++ templates

编辑:

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

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

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/

相关文章:

python - OpenCV 3 与 Python 3 on Windows 独立高清

c++ - QT.pro 文件 : How to change default include path for MAC frameworks

php - 通过 AJAX 模板化动态加载内容的最佳方法?

c++ - 如何防止带有模板的整个 API 变成仅 .h 文件的集合?

c++ - 返回一个模板,没有匹配的函数可供调用

json - Phoenix : render JSON from a template

c++ - 处理用于构造有用值的旧变量

c++ - 如何拥有灵活的嵌套初始化器?

c++ - Windows服务安装返回错误1053

c++ - 作为非成员的算术复合运算符重载