Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 明确禁止具体的类模板专门化_C++_Templates_C++11_Template Specialization_Class Template - Fatal编程技术网

C++ 明确禁止具体的类模板专门化

C++ 明确禁止具体的类模板专门化,c++,templates,c++11,template-specialization,class-template,C++,Templates,C++11,Template Specialization,Class Template,我有一个类模板: template< typename ...bounded_types > struct variant {}; 但要禁止有界类型的空列表,即必须在编译时禁止变量。我可以做到以下几点: template<> struct variant<>; 但还不太清楚:如果我的变体库包含大量的头,那么上面的专门化是否不是下面某个地方定义的类的前向声明就不明显了。在我看来,理想的想象解决方案是: template<> struct vari

我有一个类模板:

template< typename ...bounded_types >
struct variant {};
但要禁止有界类型的空列表,即必须在编译时禁止变量。我可以做到以下几点:

template<>
struct variant<>;
但还不太清楚:如果我的变体库包含大量的头,那么上面的专门化是否不是下面某个地方定义的类的前向声明就不明显了。在我看来,理想的想象解决方案是:

template<>
struct variant<> = delete;

这明显地看起来更为明显,但不幸的是,C++语法也禁止了。

满足所述意图的最明确方式是什么

template<typename... bounded_types>
struct variant {
    static_assert(sizeof...(bounded_types) > 0, "empty variant is illegal");
};
看看它是如何失败的: 看看它是如何成功的:

看看它是如何失败的:
看看它是如何成功的:

在你的情况下,你可以这样做

template<typename T, typename ...bounded_types >
struct variant
{};

在你的情况下,你可以这样做

template<typename T, typename ...bounded_types >
struct variant
{};

这种方法会使变型设计变得非常复杂。这种方法会使变型设计变得非常复杂。