gpt4 book ai didi

通过基类的 C++ 模板特化

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:57 26 4
gpt4 key购买 nike

当我用类调用 foo 的构造函数时,我希望能够让编译器大喊大叫那不是从 _base* 派生的。当前代码仅允许 foo<_base*> 本身。任何简单的解决方案?

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
}

主要代码:

foo<_base*>    a;    // should work 
foo<_derived*> b; // should work (but doesnt)
foo<int*> c; // should not work (and infact doesnt)

最佳答案

使用 SFINAE(通过 enable_if)和 Boost 的 is_convertible type trait :

template <typename T, typename Enabled = void>
class foo
{
private:
foo(); // Constructor declared private and not implemented.
};

template <typename T>
class foo<T, typename enable_if<is_convertible<T, _base*> >::type>
{
public:
foo() { /* regular code */ }
};

(未经测试, native 未安装 Boost。)

关于通过基类的 C++ 模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1657830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com