C++ C++;通过基类进行模板专门化
当我用一个类调用foo的构造函数时,我希望能够让编译器发出呼喊 不是从_base*派生的。当前代码只允许foo本身。任何 简单的解决方案C++ C++;通过基类进行模板专门化,c++,templates,specialization,partial-specialization,C++,Templates,Specialization,Partial Specialization,当我用一个类调用foo的构造函数时,我希望能够让编译器发出呼喊 不是从_base*派生的。当前代码只允许foo本身。任何 简单的解决方案 class _base { public: // ... }; class _derived: public _base { public: // ... }; template <typename T> class foo { public: foo () { void TEMPLATE_ERROR; } }
class _base
{
public:
// ...
};
class _derived: public _base
{
public:
// ...
};
template <typename T>
class foo
{
public:
foo () { void TEMPLATE_ERROR; }
};
template <> foo<_base*>::foo ()
{
// this is the only constructor
}
class\u基
{
公众:
// ...
};
类_派生:公共_基
{
公众:
// ...
};
模板
福班
{
公众:
foo(){void TEMPLATE_ERROR;}
};
模板foo::foo()
{
//这是唯一的构造函数
}
主要代码:
foo<_base*> a; // should work
foo<_derived*> b; // should work (but doesnt)
foo<int*> c; // should not work (and infact doesnt)
fooa;//应该有用
foob;//应该起作用(但不起作用)
foo c;//不应起作用(事实上不起作用)
使用SFINAE(via)和Boost:
模板
福班
{
私人:
foo();//构造函数声明为私有且未实现。
};
模板
福班
{
公众:
foo(){/*常规代码*/}
};
(未经测试,此计算机上未安装Boost。)使用SFINAE(via)和Boost:
模板
福班
{
私人:
foo();//构造函数声明为私有且未实现。
};
模板
福班
{
公众:
foo(){/*常规代码*/}
};
(未经测试,此计算机上尚未安装Boost。)我知道您的项目中没有使用Boost,但也许您可以复制粘贴其中的某些部分 我使用boost找到了一个更简单的问题解决方案:
template <typename T>
class foo
{
public:
foo () {
BOOST_STATIC_ASSERT((boost::is_convertible<T,_base*>::value));
}
};
模板
福班
{
公众:
foo(){
BOOST_STATIC_ASSERT((BOOST::is_convertable::value));
}
};
它不需要额外的模板参数,也不需要模板专门化。我用boost 1.40对它进行了测试。我知道您的项目中没有使用boost,但也许您可以复制粘贴它的某些部分 我使用boost找到了一个更简单的问题解决方案:
template <typename T>
class foo
{
public:
foo () {
BOOST_STATIC_ASSERT((boost::is_convertible<T,_base*>::value));
}
};
模板
福班
{
公众:
foo(){
BOOST_STATIC_ASSERT((BOOST::is_convertable::value));
}
};
它不需要额外的模板参数,也不需要模板专门化。我使用boost 1.40对其进行了测试。如果没有boost,您可以使用以下内容来确定指向类型的指针是否可以隐式转换为指向类型的另一个指针:
template <class Derived, class Base>
struct IsConvertible
{
template <class T>
static char test(T*);
template <class T>
static double test(...);
static const bool value = sizeof(test<Base>(static_cast<Derived*>(0))) == 1;
};
如果不使用Boost,您可以使用类似以下内容来确定指向类型的指针是否可以隐式转换为指向类型的另一个指针:
template <class Derived, class Base>
struct IsConvertible
{
template <class T>
static char test(T*);
template <class T>
static double test(...);
static const bool value = sizeof(test<Base>(static_cast<Derived*>(0))) == 1;
};
Thanx,我读了这些链接,它们引发了一些想法。这应该是一个很好的解决方案,但我目前还没有使用boost。boost的美妙之处在于,你只能使用它的一部分——特别是,大多数标题都可以复制粘贴到你的项目目录或系统包含目录中。Thanx,我通读了这些链接,它们引发了一些想法。这应该是一个很好的解决方案,但到目前为止我还没有使用boost。boost的美妙之处在于,您只能使用它的一部分–特别是,大多数标题可以复制粘贴到您的项目目录或系统包含目录中。啊,谢谢。我试着自己跳进boost djungle中去弄清楚,但是我在很多代码混乱中绊倒了,所以我不得不撤退。但是,这正是我正在寻找的,谢谢。我建议你阅读“现代C++设计:Andrei Alexandrescu应用的通用编程和设计模式”,如果你想学习更多的模板相关的技术,比如1。谢谢你的推荐书!啊,谢谢你。我试着自己跳进boost djungle中去弄清楚,但是我在很多代码混乱中绊倒了,所以我不得不撤退。但是,这正是我正在寻找的,谢谢。我建议你阅读“现代C++设计:Andrei Alexandrescu应用的通用编程和设计模式”,如果你想学习更多的模板相关的技术,比如1。谢谢你的推荐书!