使用模板化可变参数模板参数作为专用参数(Use a templated variadic template parameter as specialized parameter)

编程入门 行业动态 更新时间:2024-10-27 20:31:59
使用模板化可变参数模板参数作为专用参数(Use a templated variadic template parameter as specialized parameter)

我的标题可能是错的 - 如果是这样,请纠正我,但在某些时候我很难跟踪我实际上想要实现的东西;)

我有一个这样的类函数模板:

template<template<typename...> class MapType> Expression Expression::substitute(MapType<std::string, Expression> const& identifierToExpressionMap) const { return SubstitutionVisitor<MapType>(identifierToExpressionMap).substitute(something); }

重要的部分是MapType。 这个想法是允许std::map或std::unordered_map随意插入。 使用GCC和Clang,这可行,但Visual Studio 2013会抛出编译错误:

error C2664: 'Expression Expression::substitute<std::map>(const MapType &) const' : cannot convert argument 1 from 'std::map<std::string,Expression,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'const std::map &' 1> with 1> [ 1> MapType=std::map 1> ] 1> and 1> [ 1> _Kty=std::string 1> , _Ty=Expression 1> ] 1> Reason: cannot convert from 'std::map<std::string,Expression,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'const std::map' 1> with 1> [ 1> _Kty=std::string 1> , _Ty=Expression 1> ] 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

似乎MSVC没有把MapType和<std::string, Expression>放在一起作为一个类型,我在这里遗漏了什么?

所以我的问题是

这是可能的,只是MSVC中的一个错误,或者 是否有更简单的方法来做到这一点。 请记住,还有许多其他类接收MapType参数,并使用不同的键/值类型实例化自己的版本。

My title might be wrong - if so, please do correct me, but at some point its hard for me to keep track of what meta thingy I'm actually trying to achieve ;)

I have a class function template like this:

template<template<typename...> class MapType> Expression Expression::substitute(MapType<std::string, Expression> const& identifierToExpressionMap) const { return SubstitutionVisitor<MapType>(identifierToExpressionMap).substitute(something); }

The important part is the MapType. The idea is to allow either std::map or std::unordered_map to be plugged in at will. With GCC and Clang, this works, but Visual Studio 2013 throws a compilation error:

error C2664: 'Expression Expression::substitute<std::map>(const MapType &) const' : cannot convert argument 1 from 'std::map<std::string,Expression,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'const std::map &' 1> with 1> [ 1> MapType=std::map 1> ] 1> and 1> [ 1> _Kty=std::string 1> , _Ty=Expression 1> ] 1> Reason: cannot convert from 'std::map<std::string,Expression,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' to 'const std::map' 1> with 1> [ 1> _Kty=std::string 1> , _Ty=Expression 1> ] 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

It seems that MSVC does not put MapType and <std::string, Expression> together as a type, am I missing something here?

So my question is

is this possible and just a bug in MSVC, or is there an easier way to do this. Please keep in mind that there are many other classes which receive the MapType parameter and instantiate their own version with different key/value Types.

最满意答案

它可能归结为:

template<class T, class U = int> struct cat {}; template< template<class...> class Animal > void foo() { Animal<int> x; (void)x; // (A) } int main() { foo<cat>(); }

这个看似无辜的小程序被clang ++和g ++接受,但不是MSVC2013 Update 1。


线(A)是有问题的:我认为在这个例子中很明显模板模板参数 Animal在传递类模板cat时应该有两个模板参数。

似乎clang ++和g ++支持在行(A)中使用此模板模板参数的默认模板参数,而MSVC则不支持。

我不知道标准是否要求其中任何一个; 看看例如

这个答案是理查德史密斯 CWG活跃期#150

在我看来,支持默认模板参数很有用,因为(如活动问题中所述)标准库的类模板可能有其他模板参数(使用默认参数); 如果你想(直接)使用它们作为模板模板参数 ,你需要知道那些实现细节。

It probably boils down to this:

template<class T, class U = int> struct cat {}; template< template<class...> class Animal > void foo() { Animal<int> x; (void)x; // (A) } int main() { foo<cat>(); }

This little innocent-looking program is accepted by clang++ and g++, but not by MSVC2013 Update 1.


Line (A) is the problematic one: I think in this example it's clear that the template template-parameter Animal should have two template parameters, when passing the class template cat.

It seems that clang++ and g++ support the use of default template arguments for this template template-parameter in line (A), while MSVC does not.

I do not know if the Standard requires either of them; see for example

this answer by Richard Smith CWG active issue #150

It certainly appears to me that supporting the default template arguments is useful, since (as said in the active issue) the class templates of the Standard Library may have additional template parameters (with default arguments); and you'd need to know those implementation-details if you wanted to use them (directly) as template template-arguments.

更多推荐

本文发布于:2023-07-18 19:23:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1164510.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:参数   模板   templated   variadic   parameter

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!