C++ 如何强制模板化与基类匹配?
我有一个模板函数,它是为C++ 如何强制模板化与基类匹配?,c++,templates,explicit-instantiation,C++,Templates,Explicit Instantiation,我有一个模板函数,它是为Base类显式实例化的,但不是为派生的类显式实例化的。如何强制传递派生类(或其他派生类)的使用与基本类匹配 头文件: class Base { }; class Derived : public Base { }; class Derived2 : public Base { }; template <typename Example> void function(Example &arg); 类基{ }; 派生类:公共基{ }; 派生类2:公共基
Base
类显式实例化的,但不是为派生的
类显式实例化的。如何强制传递派生类(或其他派生类)的使用与基本类匹配
头文件:
class Base {
};
class Derived : public Base {
};
class Derived2 : public Base {
};
template <typename Example> void function(Example &arg);
类基{
};
派生类:公共基{
};
派生类2:公共基{
};
模板无效函数(示例和参数);
实施文件:
// Explicitly instantiate Base class:
template void function<Base>(Base &arg);
// Define the template function:
template <typename Example> void function(Example &arg) {
// Do something.
}
//显式实例化基类:
模板无效函数(基本和参数);
//定义模板功能:
模板无效函数(示例和参数){
//做点什么。
}
因为我没有显式地实例化Derived
或Derived2
的函数,所以我得到了未定义的引用,但是,我想绑定到显式定义的Base
类
如何强制模板解析为使用C++-03从Base派生的所有对象的基类
我可以将派生的类专门化为基本的类定义吗?如何:
template <> void function(Derived &arg)
{
function<Base>( arg );
}
模板无效函数(派生的&arg)
{
功能(arg);
}
编辑:您也可以通过函数重载来执行此操作,正如aschepler所建议的:
void function(Derived &arg)
{
function<Base>( arg );
}
void函数(派生的&arg)
{
功能(arg);
}
这在概念上是一样的,尽管我同意,稍微好一点:)怎么样:
template <> void function(Derived &arg)
{
function<Base>( arg );
}
模板无效函数(派生的&arg)
{
功能(arg);
}
编辑:您也可以通过函数重载来执行此操作,正如aschepler所建议的:
void function(Derived &arg)
{
function<Base>( arg );
}
void函数(派生的&arg)
{
功能(arg);
}
在概念上是一样的,尽管我同意,稍微好一点:)与其使用模板,为什么不使用一组重载函数呢?这样编译器就知道哪个集合可用,并可以相应地进行选择。如果要共享实现,请将这些函数转发到模板。如果function
的参数应始终为Base&
,则function
不应在其参数列表中使用模板参数,并且可能根本不应是模板。@Sjoerd,因为大约有20个重载,我不希望将它们放在头文件中,而是将它们作为显式实例化移动到实现中,而且,我现在只显示一次定义,而不是每次重载显示二十次。调用函数时,您始终可以将arg
强制转换为(Base&)派生的
。:)@亚历克斯:我不想在打电话的时候这样做,因为这对我来说太麻烦了。我想告诉头文件中的编译器这样做。与其使用模板,为什么不使用一组重载函数呢?这样编译器就知道哪个集合可用,并可以相应地进行选择。如果要共享实现,请将这些函数转发到模板。如果function
的参数应始终为Base&
,则function
不应在其参数列表中使用模板参数,并且可能根本不应是模板。@Sjoerd,因为大约有20个重载,我不希望将它们放在头文件中,而是将它们作为显式实例化移动到实现中,而且,我现在只显示一次定义,而不是每次重载显示二十次。调用函数时,您始终可以将arg
强制转换为(Base&)派生的
。:)@亚历克斯:我不想在打电话的时候这样做,因为这对我来说太麻烦了。我想在头文件中告诉编译器这样做。宁愿函数重载也不要函数模板的显式专门化:inlinevoid函数(派生&arg){function(arg);}
@aschepler我认为编译器会在匹配您在这里给出的重载之前匹配模板定义。当非模板函数和函数模板专用化具有相同的函数类型时,重载解析始终选择非模板。与函数模板的显式专门化相比,更喜欢函数重载:inline void function(派生&arg){function(arg);}
@aschepler我认为编译器会在匹配您在这里给出的重载之前匹配模板定义。当非模板函数和函数模板专用化具有相同的函数类型时,重载解析总是选择非模板。