gpt4 book ai didi

c++ - 根据数字模板参数有条件地编译转换运算符

转载 作者:太空狗 更新时间:2023-10-29 23:43:35 25 4
gpt4 key购买 nike

我有一个 template <bool P> class Foo里面有很多代码。我希望能够转换 Foo<true>进入 Foo<false>的,即有一个 operator Foo<false>()方法。但是编译器不喜欢 Foo 存在的这种方法,它只喜欢 Foo<true>。 , 并给出关于如何“不会调用运算符进行隐式或显式转换”的警告 (GCC 5.4.x)

我似乎不能为此使用 SFINAE:std::enable_if与类型一起工作;和我尝试过的值变体(真实情况有一个 value 而不是一个 type 成员)也没有帮助。

我怎样才能让这个运算符只针对 Foo<false> 进行编译? (除了专门化 Foo<false> 不同并复制我的所有代码)?

到目前为止我最好的尝试是:

template <bool P> class Foo {
// etc. etc.
template <bool OtherValue>
operator Foo<OtherValue>()
{
static_assert(OtherValue, "You should not be using this conversion!");
// conversion code here
return Foo<false>(args,go,here);
}
}

最佳答案

How can I get this operator to only be compiled for Foo<false> (other than specializing Foo<false> different and duplicating all of my code)?

template <bool P> 
struct Foo
{
template <bool P2 = P, typename = std::enable_if_t<P2 == true>>
operator Foo<false>()
{
return {};
}
};

使用 P2 = P延迟对 enable_if_t 的评估到实际使用转换运算符的时间(而不是类实例化)


如果我们尝试简单地写:

template <typename = std::enable_if_t<P == true>>
operator Foo<false>()
{
return {};
}

std::enable_if_t<P == true>将在 Foo<P> 期间进行评估的实例化,因为在实例化成员函数时没有发生替换。替换发生在 Foo 时被实例化 - 因此 SFINAE 无法发生(因为还没有设置任何重载决议)

通过添加 bool P2 = P默认参数,我们延迟替换到转换运算符的实例化。这发生在重载决议期间,因此 SFINAE 可以发生。

这个答案比我能解释得更好:https://stackoverflow.com/a/13401982/598696

关于c++ - 根据数字模板参数有条件地编译转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46907372/

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