我想知道是否可以编写一个模板函数,可以将任何其他任意模板作为参数并正确匹配模板名称(即不仅仅是结果类).我所知道的工作是:
template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);
Run Code Online (Sandbox Code Playgroud)
这将匹配例如用于f(std::vector<int>())或f(std::list<int>())但不会对工作f(std::array<int, 3>()),作为第二个参数是一个size_t无类型.
现在我想我可以做一些疯狂的事情:
template<template<typename ...> class TemplateT, size... Sizes, typename... TemplateP>
void f(const TemplateT<Sizes..., TemplateP...>& param);
Run Code Online (Sandbox Code Playgroud)
希望编译器能够正确地将TemplateP省略号或Sizes省略号导出为空.但它不仅难看,它仍然适用于采用任何类型或size_t参数的模板.它仍然不会匹配任意模板,例如bool参数.
对于重载方法也是如此:
template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);
template<template<typename ...> class TemplateT, size... Sizes>
void f(const TemplateT<Sizes...>& param);
Run Code Online (Sandbox Code Playgroud)
此外,这种方法不会"工作,如果我们想混size_t和typenames.那么匹配任何内容所需要的就是这样的东西,其中对省略号中允许的内容没有任何限制:
template<template<...> class TemplateT, ... Anything>
void f(const TemplateT<Anything...>& param);
Run Code Online (Sandbox Code Playgroud)
该语法不起作用,但也许还有其他语法来定义这样的东西? …
我想检查两种类型是否属于同一模板。作为示例,我希望返回以下代码片段true,因为尽管内部元素具有不同类型,但两个对象都是向量。
在编译时进行检查很重要(这就是该函数为 constexpr 的原因)。
#include <iostream>
#include <type_traits>
#include <vector>
template <typename Container1, typename Container2> constexpr bool CheckTypes(Container1 c1, Container2 c2)
{
return std::is_same<Container1,Container2>::value;
}
int main()
{
std::vector<int> v1(100,0);
std::vector<double> v2(100,0);
std::cout << CheckTypes(v1,v2);
}
Run Code Online (Sandbox Code Playgroud) 如何检查给定类型是否是特定类模板的特化?例如,给定
template <class T>
struct A {};
Run Code Online (Sandbox Code Playgroud)
我怎么可以检查是否CompareT是A<*>某种类型*如下所示:
template<class CompareT>
void compare(){
// is this A ?
cout << is_same< A<*> , CompareT >::value; // A<*> ????
}
int main(){
compare< A<int> >();
}
Run Code Online (Sandbox Code Playgroud)
例如,这里 A<int>应匹配A<*>并打印1.