gpt4 book ai didi

c++ - 模板类方法的部分特化或实例化

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:22 24 4
gpt4 key购买 nike

我有几个模板参数的模板结构

template<class Result, class T, class K>
struct MyClass
{
public:
Result foo()
{
return Result{};
}
};

除了 Result 为空的情况外,该结构适用于所有模板。我明白,Result{} 不能实现为 void 类型,所以我目前的解决方案是像这样使用部分特化:

template<class T, class K>
struct MyClass<void, T, K>
{
public:
void foo()
{
return;
}
};

这允许执行以下操作:

int main()
{
MyClass<void, double, char> mycl1;
MyClass<int, double, char> mycl2;

mycl1.foo();
mycl2.foo();
}

有没有一种方法可以使 mycl1.foo() 在 C++ 14 标准中无需部分类特化即可编译?我可以使用 if constexr 和 type trait is_void_v 组合,但我想知道是否有办法:

  • 模板类方法部分显式特化

  • 模板类方法的实例化

最佳答案

虽然你做不到

Result foo()
{
return Result{};
}

如果Resultvoid,则可以使用

Result foo()
{
return Result();
}

这种情况下的行为是相同的,您将得到一个返回值初始化的对象。当 Resultvoid[expr.type.conv]\2 允许使用此语法

If the initializer is a parenthesized single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression. If the type is cv void and the initializer is (), the expression is a prvalue of the specified type that performs no initialization. Otherwise, the expression is a prvalue of the specified type whose result object is direct-initialized with the initializer. For an expression of the form T(), T shall not be an array type.

即将推出,不过您将能够使用

return Result{};

即使 Resultvoid,因为 C++20 添加到该部分 {} 也适用于 void [expr.type.conv]\2现在状态

If the initializer is a parenthesized single expression, the type conversion expression is equivalent to the corresponding cast expression. Otherwise, if the type is cv void and the initializer is () or {} (after pack expansion, if any), the expression is a prvalue of the specified type that performs no initialization. Otherwise, the expression is a prvalue of the specified type whose result object is direct-initialized with the initializer. If the initializer is a parenthesized optional expression-list, the specified type shall not be an array type.

关于c++ - 模板类方法的部分特化或实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55819105/

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