如何在返回类型上有条件地编译模板化函数

时间:2012-06-11 16:05:45

标签: c++ templates

如果我在返回类型上用C ++模板化函数:

template<class T> T foo(int x) { };

我可以使用显式模板特化来创建double实例:

template<> double foo<double>(int x) { };

我尝试使用前向声明来创建未定义struct的实例:

struct bar;
template<> bar foo<bar>(int x) { }

error: return type ‘struct bar’ is incomplete失败。我思考即使在When to use forward declaration?上阅读了已接受的答案之后,这也是允许的,直到我创建foo<bar>的实例,才会创建显式的模板化代码。显然情况并非如此(为什么不呢?)。

是否可以为编译时类型可能不存在的函数提供代码,并且只有在实例化特定的显式特化时才编译代码?其动机是“重载”结构阅读器,其中重载操作在编译之前(通过脚本)在程序上生成。

2 个答案:

答案 0 :(得分:2)

如果您不提供foo功能的正文:

,则可以这样做
// some header file, probably
struct bar;
template<> bar foo<bar>(int x);

// somewhere else:

struct bar { 
    //blabla 
};

// the actual implementation
template<> bar foo<bar>(int x) {
    // do something
}

只有在您实际上不需要bar的定义时,前向声明才有效。在foo函数的正文中,您需要知道该结构的大小,这就是您的代码无效的原因。

答案 1 :(得分:2)

当您定义函数的特化时,您正在定义函数,而不是函数模板。此时的规则与任何常规函数完全相同,并且因为您以需要完整类型的方式使用该类型,因此缺少bar的定义会使您的程序格式错误。

(缺少退货声明也会导致程序格式不正确......)