#include <stdio.h>class A{};class B: public A{};template<typename T>class Foo{public: int Foobar(voID) { return 10; }};// Explicit specialization for Atemplate<> int Foo< A >::Foobar( voID ) { return 20; }voID main( voID){ Foo<B> fooB; // This prints out 10 instead of wanted 20 IE compiler selects the general version printf("%d",fooB.Foobar() );}
正如我在评论中所说的那样,我希望看到20被打印出来,因为B是从A派生出来的,而10则是打印出来的.如何在不诉诸为每个派生类编写专门化的情况下调用专门化(我的实际场景有很多派生类型).
解决方法 —编辑:新的答案让我们让原始方法更易于维护.所有重要的选择都可以在Foo的定义中找到.它应该易于维护.
#include <boost/mpl/if.hpp>#include <boost/type_traits/is_base_of.hpp>#include <iostream>class A{};class B: public A{};class C{};class D : public C{};class E{};struct DefaultMethod{ static int foobar() { return 10; }};struct Method1{ static int foobar() { return 20; }};struct Method2{ static int foobar() { return 30; }};template<typename T,typename BaseClass,typename Choice1,typename OtherChoice>struct IfDerivesFrom : boost::mpl::if_< typename boost::is_base_of<BaseClass,T>::type,Choice1,OtherChoice>::type{};template<typename T>struct Foo : IfDerivesFrom<T,A,Method1,IfDerivesFrom<T,C,Method2,DefaultMethod> >{};int main(){ std::cout << Foo<A>::foobar() << std::endl; std::cout << Foo<B>::foobar() << std::endl; std::cout << Foo<C>::foobar() << std::endl; std::cout << Foo<D>::foobar() << std::endl; std::cout << Foo<E>::foobar() << std::endl; return 0;}
—原始答案
如果您可以使用boost,您可以执行以下 *** 作:
#include <boost/type_traits/is_base_of.hpp>template<bool b>class FooHelper{ int Foobar();};template<> FooHelper<true>::Foobar(){ return 20;}template<> FooHelper<false>::Foobar(){ return 10;}template<typename T>class Foo{public: int Foobar(voID) { return FooHelper<boost::is_base_of<A,T>::type::value>(); }};总结
以上是内存溢出为你收集整理的c – 根据派生类型选择类的显式特化全部内容,希望文章能够帮你解决c – 根据派生类型选择类的显式特化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)