c – 根据派生类型选择类的显式特化

c – 根据派生类型选择类的显式特化,第1张

概述嗨,我在选择具有明确特化的模板化类的正确版本时遇到问题.我想要使​​用用于专门化的类的派生类来选择特化.场景是: #include <stdio.h>class A{};class B: public A{};template<typename T>class Foo{public: int FooBar(void) { return 10; }};// Expl 嗨,我在选择具有明确特化的模板化类的正确版本时遇到问题.我想要使​​用用于专门化的类的派生类来选择特化.场景是:
#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 – 根据派生类型选择类的显式特化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1235153.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存