gpt4 book ai didi

c++ - 基于模板参数创建多个类实现

转载 作者:行者123 更新时间:2023-12-01 19:29:28 24 4
gpt4 key购买 nike

我有一个模板化的类 G:

template<int I>
class G {}

碰巧我需要基于该 int I 的 2 个实现

如果它是单个值,我总是能够这样做:

template<>
class G<int Specific_I>
{
/*Implementation for that I*/
}

如果我有单一条件,表明如果为真则使用implementation_1,如果为假则使用implementation_2,我可以使用给出的建议here

<小时/>

但是,我的情况比较一般。

假设我为每个实现定义了 I 条件:

template<int I>
constexpr bool Condition_1 = /*whatever*/;

template<int I>
constexpr bool Condition_2 = /*whatever_v2*/;

这可以根据需要轻松阅读和扩展
如果在程序中调用时由于没有或多个适用于特定 I 的条件而出现错误,我对此表示同意

显而易见的选择是使用 std::enable_if_t

template<int I,
enable_if_t<Condition_1<I>>
>
class G
{
/*Implementation based on Condition_1*/
}

template<int I,
enable_if_t<Condition_2<I>>
>
class G
{
/*Implementation based on Condition_2*/
}

但这会导致错误

template parameter ‘typename std::enable_if<Condition_1<I>, void>::type <anonymous>’|

redeclared here as ‘typename std::enable_if<Condition_2<I>, void>::type <anonymous>’|

我在哪里犯了错误,该如何解决?

最佳答案

您的错误是您没有调整主模板以正确使用习惯用法。如果您想添加那些解析为 voidenable_if,则主模板声明需要在该位置添加一个类型参数:

template<int I, typename = void>
class G; // Or static_assert in the definition. Whichever flavor you prefer.

template<int I>
class G< I, enable_if_t<Condition_1<I>> >
{
/*Implementation based on Condition_1*/
};

template<int I>
class G< I, enable_if_t<Condition_2<I>> >
{
/*Implementation based on Condition_2*/
};

注意:对于要匹配条件的特化,默认参数必须为 void。当这两个条件都成立时,这当然会导致错误,但您确实断言这对您来说没问题,所以就这样。

关于c++ - 基于模板参数创建多个类实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58429054/

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