Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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 - Fatal编程技术网

C++ 模板参数互斥

C++ 模板参数互斥,c++,templates,C++,Templates,我有一个具有多个模板参数的模板 template<typename Appl, typename StoredData> class Box { }; 这些参数的值是互斥的: i、 e.对于Appl的每个值,StoredData只允许有一组特定的类型 例如:Appl是List,StoredData-double,char Appl是树,StoredData-int 有没有办法在编译时强制执行此限制? 所以 是的,有: template<typename

我有一个具有多个模板参数的模板

    template<typename Appl, typename StoredData>
    class Box {
    };
这些参数的值是互斥的: i、 e.对于Appl的每个值,StoredData只允许有一组特定的类型

例如:Appl是List,StoredData-double,char Appl是树,StoredData-int

有没有办法在编译时强制执行此限制? 所以

是的,有:

template<typename Appl, typename StoredData>
    class Box {
        static_assert(
            std::is_same<Appl, List>::value && std::is_same<StoredData, double>::value ||
            std::is_same<Appl, Tree>::value && std::is_same<StoredData, int>::value,
            "Bad parameters"
        );
    };
下面是一个工作示例,尝试更改某些类型,它将无法编译。

是的,有:

template<typename Appl, typename StoredData>
    class Box {
        static_assert(
            std::is_same<Appl, List>::value && std::is_same<StoredData, double>::value ||
            std::is_same<Appl, Tree>::value && std::is_same<StoredData, int>::value,
            "Bad parameters"
        );
    };

下面是一个工作示例,尝试更改某些类型,它将无法编译。

只需使用Appl类型并使用部分专用化创建自定义映射即可。+静态断言可以很好地实现。或者只需将StoredData类型设置为Appl类型的内部typedef,并执行typedef typename Apply::stored_data_type store_type;。如果你愿意,我可以在以后写下这两个选项的答案。只需使用Appl类型并使用部分专用化创建自定义映射即可静态断言可以很好地实现。或者只需将StoredData类型设置为Appl类型的内部typedef,并执行typedef typename Apply::stored_data_type store_type;。如果你愿意,我可以在后面写下这两个选项的答案。另外请注意,这可以在C++11中进行推广,以使有效的StoredData类型的列表具有Appl-to组合,从而可以减少锅炉板代码。谢谢。我想那会有用的。但我只是想知道,如果我可以部分专注于App1,是否会有一种更干净的方法来做到这一点,而不必明确地说明所有选项。@excalibur:这取决于你想要在更高的层次上实现什么,而不仅仅是让它在某个类型上工作。你没说你想做什么,所以我没办法。虽然回答了您的问题,但我确信这并不是您问题的解决方案。还要注意的是,这可以在C++11中进行推广,将Appl组合到有效存储数据类型的列表中,以便减少锅炉板代码。谢谢。我想那会有用的。但我只是想知道,如果我可以部分专注于App1,是否会有一种更干净的方法来做到这一点,而不必明确地说明所有选项。@excalibur:这取决于你想要在更高的层次上实现什么,而不仅仅是让它在某个类型上工作。你没说你想做什么,所以我没办法。虽然回答了你的问题,但我相信这不是解决你问题的办法。