当前位置: 首页 > 知识库问答 >
问题:

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

张丁雷
2023-03-14

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

template<class Result, class T, class K>
struct MyClass
{
public:
    Result foo()
    {
        return 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标准中进行部分类特化?我可以使用,如果配置器和类型traitis_void_v组合,但我想找到是否有一种方法:

>

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

    模板类方法的实例化

  • 共有1个答案

    钱志强
    2023-03-14

    虽然你做不到

    Result foo()
    {
        return Result{};
    }
    

    如果结果无效,则可以使用

    Result foo()
    {
        return Result();
    }
    

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

    如果初始值设定项是一个带括号的单表达式,则类型转换表达式与相应的强制转换表达式等价(定义为,如果定义为含义)。如果类型为cv void,初始值设定项为(),则表达式是指定类型的prvalue,不执行初始化。否则,表达式是指定类型的prvalue,其结果对象由初始值设定项直接初始化。对于形式为T()的表达式,T不应是数组类型。

    即将到来,尽管你将能够使用

    return Result{};
    

    即使Resultvoid,当c20添加到该部分时,{}也适用于void。[expr.type.conv]\2现在声明

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

     类似资料:
    • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

    • 问题内容: 这是我的代码: 它运作良好。但是当我尝试添加这个 我遇到编译器错误:«int MyClass :: DoSomething()»的«>»令牌模板标识«DoSomething <0>»之前的无效显式专门化与任何模板声明都不匹配 我使用g ++ 4.6.1应该怎么做? 问题答案: 不幸的是,如果不对外部模板进行特殊化处理,就不能对作为类模板成员的模板进行特殊处理: C ++ 11 14.7

    • 请向我解释选择模板专用化的规则。我举一个例子: 为什么输出为?一般来说,专用类中的默认模板参数会发生什么情况?它会带来一些影响吗?

    • 对于DynamicMessage,我想使用不同的处理方式,所以我尝试了 但它给出了编译错误 com中的“addMessageToResult(Message,Descriptor,Builder)”。谷歌。云垂直方向。电信公司。taap。数据流。数据摄取。常见的解析器。CSVParserDynamicMessage与com中的addMessageToResult(Message,Descripto

    • 这个问题可能太难在标题中的on句子中描述,但这里有一个最小的例子: 当两种类型相同时 当这两种类型是同一类型的类模板的实例化时 天真地说,我们希望第二个部分专门化不会与第一个不明确,因为它感觉“更专门化”,对基础模板上和的推导类型施加更多限制。然而,主要的编译器似乎同意我们的期望是错误的:为什么它不被认为是更专业化的?