相关疑难解决方法(0)

与任何类型的参数匹配的C++可变参数模板模板参数

我想知道是否可以编写一个模板函数,可以将任何其他任意模板作为参数并正确匹配模板名称(即不仅仅是结果类).我所知道的工作是:

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_ttypenames.那么匹配任何内容所需要的就是这样的东西,其中对省略号中允许的内容没有任何限制:

template<template<...> class TemplateT, ... Anything>
void f(const TemplateT<Anything...>& param);
Run Code Online (Sandbox Code Playgroud)

该语法不起作用,但也许还有其他语法来定义这样的东西? …

c++ templates template-templates variadic-templates c++11

40
推荐指数
1
解决办法
2591
查看次数

检查两种类型是否属于同一模板

我想检查两种类型是否属于同一模板。作为示例,我希望返回以下代码片段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)

c++ sfinae type-traits

8
推荐指数
1
解决办法
1933
查看次数

检查类是否是模板专业化?

如何检查给定类型是否是特定类模板的特化?例如,给定

template <class T>
struct A {};
Run Code Online (Sandbox Code Playgroud)

我怎么可以检查是否CompareTA<*>某种类型*如下所示:

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.

c++ templates

6
推荐指数
2
解决办法
2042
查看次数