gpt4 book ai didi

c++ - boost::enable_if 不在函数签名中

转载 作者:可可西里 更新时间:2023-11-01 18:03:36 24 4
gpt4 key购买 nike

这只是一个关于样式的问题:我不喜欢 C++ 的模板元编程方式,它要求您使用返回类型或为 SFINAE 的技巧添加额外的虚拟参数。所以,我想到的是将 SFINAE 放在模板参数定义本身中,如下所示:

#include <iostream>
#include <boost/type_traits/is_array.hpp>
#include <boost/utility/enable_if.hpp>
using namespace std;

template <typename T, typename B=typename boost::enable_if< boost::is_array<T> >::type > void asd(){
cout<<"This is for arrays"<<endl;
}

template <typename T, typename B=typename boost::disable_if< boost::is_array<T> >::type > void asd(){
cout<<"This is for NON arrays"<<endl;
}

int main() {
asd<int>();
asd<int[]>();
}

这个例子让 g++ 提示:

../src/afg.cpp:10:97: error: redefinition of ‘template void asd()’

SFINAE 本身可以工作,因为如果我删除例如带有 disable_if 的那个,编译器错误是:

../src/afg.cpp:15:12: error: no matching function for call to ‘asd()’

这就是我想要的。

那么,有没有办法在函数的“正常”签名(即返回类型 + 参数列表)中完成 SFINAE?

编辑:这就是我最终要在实际代码中尝试的内容:

#include <iostream>
#include <type_traits>
using namespace std;

template <typename T, typename enable_if< is_array<T>::value, int >::type =0 > void asd(){
cout<<"This is for arrays"<<endl;
}

template <typename T, typename enable_if< !is_array<T>::value, int >::type =0 > void asd(){
cout<<"This is for NON arrays"<<endl;
}

int main() {
asd<int[]>();
asd<int>();
}

我使用 c++0x 而不是 boost,因为只要我需要 c++0x 来使用模板参数的默认值,我认为没有理由使用 boost,它是它的前身。

最佳答案

嗯,我通常使用这些宏来使 enable_if 结构更清晰(它们甚至可以在大多数 C++03 编译器中工作):

#define ERROR_PARENTHESIS_MUST_BE_PLACED_AROUND_THE_RETURN_TYPE(...) __VA_ARGS__>::type
#define FUNCTION_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> >, ERROR_PARENTHESIS_MUST_BE_PLACED_AROUND_THE_RETURN_TYPE
#define EXCLUDE(...) typename boost::mpl::not_<typename boost::mpl::or_<__VA_ARGS__, boost::mpl::bool_<false> >::type >::type

然后你可以这样定义你的函数:

template <typename T >
FUNCTION_REQUIRES(is_array<T>)
(void) asd(){
cout<<"This is for arrays"<<endl;
}

template <typename T >
FUNCTION_REQUIRES(EXCLUDE(is_array<T>))
(void) asd(){
cout<<"This is for NON arrays"<<endl;
}

唯一的问题是,您需要在返回类型两边加上括号。如果您忘记了它们,编译器会说“ERROR_PARENTHESIS_MUST_BE_PLACED_AROUND_THE_RETURN_TYPE”未定义。

关于c++ - boost::enable_if 不在函数签名中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743159/

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