Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++;如果模板类方法为std::vector,则启用\u<;标准::向量<;类型>&燃气轮机;_C++_Vector_Stl - Fatal编程技术网

C++ C++;如果模板类方法为std::vector,则启用\u<;标准::向量<;类型>&燃气轮机;

C++ C++;如果模板类方法为std::vector,则启用\u<;标准::向量<;类型>&燃气轮机;,c++,vector,stl,C++,Vector,Stl,我正在为接收std::vector的结构实现一个flant()方法 我希望flatte()方法仅在MyStruct使用std::vector构造时可用,而不是在使用std::vector构造时可用(当然,Type不是std::vector) 除了叮当声,它确实成功了。 根据我的实现方式,我会得到不同的错误 我想知道使用enable\u if执行此操作的正确方法 my struct的签名应类似于以下内容: template <typename Type> struct MyStruct

我正在为接收
std::vector
的结构实现一个
flant()
方法

我希望
flatte()
方法仅在
MyStruct
使用
std::vector
构造时可用,而不是在使用
std::vector
构造时可用(当然,
Type
不是
std::vector

除了叮当声,它确实成功了。 根据我的实现方式,我会得到不同的错误

我想知道使用
enable\u if
执行此操作的正确方法

my struct的签名应类似于以下内容:

template <typename Type>
struct MyStruct {

    ...

    // this should only exist if Type is an std::vector
    MyStruct<Type::value_type> flatten() {
        ...
    }

}
模板
结构MyStruct{
...
//仅当类型为std::vector时,才应存在此属性
MyStruct flatte(){
...
}
}

为什么要为此启用\u?“普通ol”类型扣减适用于您:

template <typename T>
MyStruct<vector<T>> flatten(const MyStruct<vector<vector<T>>>& input) {
    // ...
}
模板
MyStruct展平(const MyStruct&input){
// ...
}

编辑:对于更新的问题,您可能真的很想在此处使用非成员。对于您的客户来说,它是一个更简单的API,考虑到它正在做的事情,flatte可能不需要访问MyStruct的私有位,如果它不需要访问私有位,那么它应该是一个非成员非朋友

如果出于某种原因您想做这件事,您可以使用自由函数为它编写一个trait,然后在内部使用static_assert,类似于:



#包括
#包括
模板
std::false_type是_vector_helper(const T&);//的_vector_未定义
模板
std::true_type是_vector_helper的_vector_(const std::vector&);
模板
使用is_vector_of_vector_t=decltype(is_vector_of_vector_helper(std::declval());
模板
结构MyStruct{
MyStruct flatte()常量{
静态_断言(是_vector_of_t::value,
“仅应使用MyStruct调用扁平化”);
//恳求
返回{};
}
};

为什么要为此启用\u?“普通ol”类型扣减适用于您:

template <typename T>
MyStruct<vector<T>> flatten(const MyStruct<vector<vector<T>>>& input) {
    // ...
}
模板
MyStruct展平(const MyStruct&input){
// ...
}

编辑:对于更新的问题,您可能真的很想在此处使用非成员。对于您的客户来说,它是一个更简单的API,考虑到它正在做的事情,flatte可能不需要访问MyStruct的私有位,如果它不需要访问私有位,那么它应该是一个非成员非朋友

如果出于某种原因您想做这件事,您可以使用自由函数为它编写一个trait,然后在内部使用static_assert,类似于:



#包括
#包括
模板
std::false_type是_vector_helper(const T&);//的_vector_未定义
模板
std::true_type是_vector_helper的_vector_(const std::vector&);
模板
使用is_vector_of_vector_t=decltype(is_vector_of_vector_helper(std::declval());
模板
结构MyStruct{
MyStruct flatte()常量{
静态_断言(是_vector_of_t::value,
“仅应使用MyStruct调用扁平化”);
//恳求
返回{};
}
};

接吻解决方案始终为+1.:)我不希望
flant()
接收参数。它应该访问一个内部值
MyStruct
,如果你想让它成为一个成员,那么最好不要尝试启用\u If,而是在内部使用static\u assert。启用\u If会创建一个糟糕的用户体验,因为当类型推断失败时,会在重载解析发生之前出现,因此,用户会收到一条形式为“扁平化不存在”的消息,而不是您可能想要显示的消息。当你没有其他方法做某事时,这绝对是最后的选择。在这一点上,我接受任何有效的方法,我并不真正关心编译器失败时会显示什么消息。我更新了我的问题,以向您展示如何调用我的方法。您是否可以更新您的答案,以说明如何使用您对
静态断言的建议?
?接吻解决方案始终为+1.:)我不希望
flant()
接收参数。它应该访问一个内部值
MyStruct
,如果你想让它成为一个成员,那么最好不要尝试启用\u If,而是在内部使用static\u assert。启用\u If会创建一个糟糕的用户体验,因为当类型推断失败时,会在重载解析发生之前出现,因此,用户会收到一条形式为“扁平化不存在”的消息,而不是您可能想要显示的消息。当你没有其他方法做某事时,这绝对是最后的选择。在这一点上,我接受任何有效的方法,我并不真正关心编译器失败时会显示什么消息。我更新了我的问题,以向您展示如何调用我的方法。您能否更新您的答案,以说明如何使用您对
静态断言的建议?