相关疑难解决方法(0)

返回转换容器的std :: transform-like函数

我正在尝试实现一个类似于std::transform算法的函数,而不是通过我想创建的参数获取输出迭代器,并返回一个带有转换输入元素的容器.

让我们说它的名称transform_container并带有两个参数:容器和仿函数.它应返回相同的容器类型,但可能由不同的元素类型进行参数化(Functor可以返回不同类型的元素).

我想使用我的函数,如下例所示:

std::vector<int> vi{ 1, 2, 3, 4, 5 };
auto vs = transform_container(vi, [] (int i) { return std::to_string(i); }); 
//vs will be std::vector<std::string>
assert(vs == std::vector<std::string>({"1", "2", "3", "4", "5"}));

std::set<int> si{ 5, 10, 15 };
auto sd = transform_container(si, [] (int i) { return i / 2.; }); 
//sd will be of type std::set<double>
assert(sd == std::set<double>({5/2., 10/2., 15/2.}));
Run Code Online (Sandbox Code Playgroud)

我能够写两个函数 - 一个for std::set和one for std::vector- 似乎正常工作.它们是相同的,除了容器类型名称.他们的代码如下所示.

template<typename T, typename Functor> …
Run Code Online (Sandbox Code Playgroud)

c++ templates stl c++11

39
推荐指数
4
解决办法
6863
查看次数

检查类是否是模板专业化

我想检查一个类是否是另一个的模板专用化。我试过的是:

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)

当所有模板参数都是类型实参,但不是某些非类型实参时,它可以正常工作。例如,它可以使用std::vector但不能使用std::array(因为后者接受一个非类型参数std::size_t)。

在编译时进行检查很重要。同样,该解决方案必须适用于任何模板,而不仅仅是矢量或数组。这意味着它可以是任意数量的类型参数和任意数量的非类型参数。例如,它应该与template <class A, bool B, class C, int D, class... Args> class foo;

c++

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

如何检查两个类型是否来自同一个模板类

我想检查两种类型是否相同,但不管它们的模板参数如何.像这样的东西:

template<class T>
class A {};
class B {};

int main() {
    cout << std::is_same_template<A<int>, A<string>>::value << endl; // true
    cout << std::is_same_template<A<int>, B>::value << endl; // false
}
Run Code Online (Sandbox Code Playgroud)

我知道std::is_same检查两种类型是否匹配.

我需要这个的原因:我有一个可以用任何类型调用的模板化方法,但我想禁止使用类型调用A(模板化),可能使用a static_assert.是A不是模板,我相信它可以很容易地使用来完成std::is_same,但现在,我有一个问题...

编辑:我可以手动排除A为几个常见的Ts,使用,我正在寻找一种方法来做所有T:

static_assert(!std::is_same<parameter_type, A<int>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<double>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<bool>>::value, "Cannot use this function with type A<T>");
Run Code Online (Sandbox Code Playgroud)

c++ templates types

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

标签 统计

c++ ×3

templates ×2

c++11 ×1

stl ×1

types ×1