Function C++;11专门化变量函数的一个版本

Function C++;11专门化变量函数的一个版本,function,c++11,templates,variadic,specialization,Function,C++11,Templates,Variadic,Specialization,我试图创建一个变量函数,它可以接受任意数量的参数,但是我想专门处理这样一种情况,即只传入两个带迭代器的参数。传入两个非迭代器参数时,仍应使用通用变量版本。我遇到了一个我无法克服的static\u assert故障。它似乎试图使用_iterator _args对中的整个表达式求值,如果函数的参数少于两个,则会失败,而不是在检查两个参数已产生false时跳过对其余表达式的求值 有没有一种方法可以做到这一点,而不用为一个和两个参数的情况再添加两个重载 这就是我到目前为止所做的: #包括 #包括 #包括

我试图创建一个变量函数,它可以接受任意数量的参数,但是我想专门处理这样一种情况,即只传入两个带迭代器的参数。传入两个非迭代器参数时,仍应使用通用变量版本。我遇到了一个我无法克服的
static\u assert
故障。它似乎试图使用_iterator _args对
中的整个表达式求值,如果函数的参数少于两个,则会失败,而不是在检查两个参数已产生false时跳过对其余表达式的求值

有没有一种方法可以做到这一点,而不用为一个和两个参数的情况再添加两个重载

这就是我到目前为止所做的:

#包括
#包括
#包括
//灵感来自https://stackoverflow.com/a/7943765/2129246
模板
结构参数
{
枚举{arity=sizeof…(Args)};
模板
结构参数
{
typedef typename std::tuple_元素::type type;
};
};
//基于:https://stackoverflow.com/a/30766365/2129246
模板
结构是迭代器
{
静态炭试验(…);
模板静态长测试(U&&);
constexpr static bool value=std::is_same::value;
};
模板
结构是\u迭代器\u参数
{
constexpr static bool value=is_iterator::value&&is_iterator::value;
};
模板
带_迭代器_参数的结构
{
constexpr static bool value=args\u traits::arity==2
&&是迭代器参数值;
};
模板::类型>
void some_func(T first,Args&…Args)
{

std::cout我似乎只能通过添加更多重载来实现,而不能将
与迭代器\u args一起使用:

模板
使某些函数无效(T优先,参数&&…参数)
{
std::cout::type>
作废某些函数(T优先,开始,结束)
{

std::cout在您的情况下,问题是
&&
之前和之后的表达式都必须编译-即使
&&
之后的表达式不会被使用

我的第一次尝试是利用C++17
constexpr if

template<typename... Args>
struct with_iterator_args
{
private:
    constexpr static bool value_checker() {
        if constexpr (args_traits<Args...>::arity == 2) {
            return is_iterator_args<typename args_traits<Args...>::template arg<0>::type, typename args_traits<Args...>::template arg<1>::type>::value;
        }
        else {
            return false;
        }
    }

public:
    constexpr static bool value = value_checker();
};

如果constexpr
似乎是C++17的一个特性,那就太棒了,不幸的是
。似乎重载是C++11唯一可行的解决方案only@user2129246谢谢你的提示。我只看了问题和标签,只是错过了标题要求C++11解决方案。我调整了答案,给出了C++17和C++11解决方案。如果你严格要求C++11,你能把你的问题标记为C++11!?
template<typename... Args>
struct with_iterator_args
{
private:
    constexpr static bool value_checker() {
        if constexpr (args_traits<Args...>::arity == 2) {
            return is_iterator_args<typename args_traits<Args...>::template arg<0>::type, typename args_traits<Args...>::template arg<1>::type>::value;
        }
        else {
            return false;
        }
    }

public:
    constexpr static bool value = value_checker();
};
template<typename... Args>
struct is_iterator_args :
    std::conditional<is_iterator<typename args_traits<Args...>::template arg<0>::type>::value &&
                     is_iterator<typename args_traits<Args...>::template arg<1>::type>::value,
                    std::true_type, std::false_type>::type
{
};

template<typename... Args>
struct with_iterator_args :
     std::conditional<sizeof...(Args) == 2, is_iterator_args<Args...>, std::false_type>::type
{
};