【问题标题】:Explicit Template Function and Method Specialization显式模板函数和方法特化
【发布时间】:2012-05-18 01:48:19
【问题描述】:

我一直在寻找一个明确的答案,我只是从网络上抓取一些零碎的东西。

我有一个函数,它需要根据类型变量采取不同的行动。该函数不接受任何参数,因此重载不起作用,导致模板特化。例如:

//Calls to this function would work like this:
int a = f();
int b = f<int>();
int c = f<char>();
//...

首先,这在语法上是否可行?我觉得是的。继续。

我在定义这个函数时遇到了问题,因为我对显式特化的语法很感兴趣。我尝试了许多不同的方法,但我什至还没有一个简单的例子可以工作。

其次,我试图(最终)将该模板函数变成(非模板)类的模板方法。当我到达时,我会穿过那座桥。

谢谢,
伊恩

【问题讨论】:

    标签: c++ templates template-specialization


    【解决方案1】:

    嗯,这是可能的,但不是更好的事情之一。显式模板函数特化有点暗角,但您可以这样做:

    template< typename T > int f(){ ... }
    
    template<> int f<int>(){ ... }
    template<> int f<char>(){ ... }
    

    一些相关阅读:http://www.gotw.ca/gotw/049.htm

    【讨论】:

    • 谢谢。我已经猜到了,但我的链接器一直说有多重定义的符号?
    • 您将这些内容写在标题中并包含在多个翻译单元中?在这个意义上,模板函数的显式特化就像一个常规函数。您必须定义它们 inline 或在未命名的命名空间中(C++ static 等效项)。否则,只需在标头中声明它们并在 cpp 文件中定义它们。
    • 在标题中是;但包括警卫。我能够让它使用未命名的命名空间 xor 内联。但是,当我解决第二个问题(将其转换为方法)时,它再次失败(尝试内联)。至于把它放在一个 .cpp 文件中,iirc 将模板与 C++ 中的实现分开没有问题吗?
    • 包含守卫可以防止您在一个翻译单元中定义相同的东西,但不能在多个翻译单元中多次定义它。向我们展示您正在做什么以将它们转化为方法,以便我们可以帮助您。将模板与实现分离存在问题,但模板类或函数的显式特化不会遇到此类问题,因为它们绑定到特定类型。
    • 我想出了如何让它适应类方法。这主要是我改变它的错误。以下链接很有用:stackoverflow.com/questions/3416339/…。感谢您的帮助!
    【解决方案2】:

    首先,这在语法上是否可行?我觉得是的。

    是的,但不要过度复杂化——这只需要简单的重载:

    int f()
    {
        return /* default, typeless implementation */;
    }
    
    template<typename T>
    int f()
    {
        return /* type-specific implementation */;
    }
    
    template<>
    int f<char>()
    {
        return /* char implementation */;
    }
    
    template<>
    int f<int>()
    {
        return /* int implementation */;
    }
    

    【讨论】:

    • 如何为 int 或 char 或其他什么定义不同的功能?对不起;也许我错过了什么。
    • @Ian :然后您将专门化,如在编辑中,或在主模板内使用编译时常量 if 语句。没有具体的目标,很难给出具体的指导……
    • “没有具体目标,很难给出具体指导。”是的;我为此责备自己。您的编辑基本上是我们想出的。不明白为什么第一个非模板函数是必要的。不过感谢您的帮助!
    • @Ian :为了使f(); 有效,第一个非模板重载是必要的。
    • @Ian:这简直是不可能的,抱歉——您的代码中一定有一些正常的f 重载,而您缺少这些。 Demo1(不起作用),demo2(起作用)。
    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2011-01-07
    • 2010-11-27
    相关资源
    最近更新 更多