gpt4 book ai didi

c++ - 如何在函数模板中声明模板特化?

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:47 25 4
gpt4 key购买 nike

假设我有一个类模板

template<int I, int J> class bar { /* ... */ };

并且想使用下面的模板模板

template<template<int> class C>
struct foo { void func(some_type arg); };

C 等于 bar,第二个模板参数绑定(bind)(固定)。实现这一目标的一种方法是

template<int J, template<int, int> class B>
struct use_foo_helper {
template<int I> using BJ = B<I,J>;
static void func(some_type arg) { foo<BJ>::func(arg); }
};
template<int J>
void foo_bar(some_type arg) { use_foo_helper<J,bar>::func(arg); }

但是,仅仅为此目的创建一个辅助类 (use_foo_helper) 是非常不方便的。我宁愿只定义函数模板 foo_bar,但失败了:

template<int J>
void foo_bar(some_type arg)
{
// template<int I> using barJ = bar<I,J>; // this appears to be illegal
// for<barJ>::func(arg);
foo< ??? >::func(arg); // what shall I put in place of ???
};

Q 有没有办法避免 helper 类? 有没有更好的设计模式可以达到同样的效果?

最佳答案

您可以通过以下方式执行此操作:

template <int I, int J>
class bar{};

template <template<int> class C>
struct foo
{
static
void func(some_type arg){}
};

template <int J>
class foo_bar
{
template <int I>
using barJ = bar<I, J>;

public:

static
void call(some_type arg)
{
foo<barJ>::func(arg);
}
};

使用示例:foo_bar</*...*/>::call(/*...*/); .

但是如果您只想修复类模板的一个参数,则可以更简单地完成:

template <int J>
struct barJ
{
template <int I>
using type = bar<I, J>;
};

使用示例:foo<barJ</*...*/>::type>::func(/*...*/); .

关于c++ - 如何在函数模板中声明模板特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com