模板类方法的部分专业化或实例化

Dem*_*unt 7 c++ templates

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

template<class Result, class T, class K>
struct MyClass
{
public:
    Result foo()
    {
        return Result{};
    }
};
Run Code Online (Sandbox Code Playgroud)

此结构对所有模板都适用,但Result为空时除外。我知道,Result{}不能将其实现为void类型,所以我当前的解决方案是使用部分专业化,如下所示:

template<class T, class K>
struct MyClass<void, T, K>
{
public:
    void foo()
    {
        return;
    }
};
Run Code Online (Sandbox Code Playgroud)

这允许执行以下操作:

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

    mycl1.foo();
    mycl2.foo();
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以使mycl1.foo()C ++ 14标准中没有部分类专门化的情况进行编译?我可以使用if constexr和键入特征is_void_v组合,但是我想查找是否有以下方法:

  • 模板类方法的专业化部分显式

  • 模板类方法的实例化

Nat*_*ica 8

虽然你不能做

Result foo()
{
    return Result{};
}
Run Code Online (Sandbox Code Playgroud)

如果Resultvoid,则可以使用

Result foo()
{
    return Result();
}
Run Code Online (Sandbox Code Playgroud)

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

如果初始化程序是带括号的单个表达式,则类型转换表达式(在定义上,如果定义上是)等效于相应的强制转换表达式。如果类型为cv void且初始值设定项为(),则表达式为不执行初始化的指定类型的prvalue。否则,表达式是指定类型的prvalue,其结果对象使用初始化程序直接初始化。对于形式为T()的表达式,T不得为数组类型。

即将推出,尽管您将能够使用

return Result{};
Run Code Online (Sandbox Code Playgroud)

即使Resultvoid如C ++ 20添加到该一节{}将工作以及对void[expr.type.conv] \ 2现在说明

如果初始化程序是带括号的单个表达式,则类型转换表达式等效于相应的强制转换表达式。否则,如果类型为cv void,并且初始化程序为()或{}(在包扩展后,如果有的话),则表达式为指定类型的prvalue,不执行初始化。否则,表达式是指定类型的prvalue,其结果对象使用初始化程序直接初始化。如果初始化程序是带括号的可选表达式列表,则指定的类型不得为数组类型。