c+中的元最小值+; 我试图用模板元编程在C++中找到最小值: template<int first,int...a> struct min { static const int value= sizeof...(a) && first>min<a...>::value ? min<a...>::value : first; }; 模板 结构最小值 { 静态常量int value=sizeof…(a)&&first>min::value? 最小::值: 第一; };

c+中的元最小值+; 我试图用模板元编程在C++中找到最小值: template<int first,int...a> struct min { static const int value= sizeof...(a) && first>min<a...>::value ? min<a...>::value : first; }; 模板 结构最小值 { 静态常量int value=sizeof…(a)&&first>min::value? 最小::值: 第一; };,c++,template-meta-programming,C++,Template Meta Programming,这将被称为: static const int eleven = min<42,97,11,59>::value; static const int-eleven=min::value; 但是,我得到了“错误数量的模板参数(0,应该是1或更多)”。我猜编译器试图实例化min而不带参数,但为什么min 为什么会出现此错误,如何修复?非常感谢您的帮助。这两个分支经过评估,您可以使用专门化来解决: template<int first, int...a> struct mi

这将被称为:

static const int eleven = min<42,97,11,59>::value;
static const int-eleven=min::value;
但是,我得到了“错误数量的模板参数(0,应该是1或更多)”。我猜编译器试图实例化
min
而不带参数,但为什么<仅当
sizeof…(a)
为非零时,才会调用code>min


为什么会出现此错误,如何修复?非常感谢您的帮助。

这两个分支经过评估,您可以使用专门化来解决:

template<int first, int...a>
struct min
{
    static const int value = (first > min<a...>::value) ? min<a...>::value : first;
};

template<int first>
struct min<first>
{
    static const int value = first;
};
模板
结构最小值
{
静态常量int值=(第一个>最小::值)?最小::值:第一个;
};
模板
结构最小值
{
静态常量int值=第一个;
};

递归实例化一次删除一个参数。它是这样的:
min
1
与需要
min
的内容进行比较,后者反过来实例化
min
以将其与
2
进行比较。现在
min
尝试实例化
min
3
进行比较,这显然不起作用

使用部分专门化

template <int first,int...a>
struct min
{ /* […] */ };

template <int first>
struct min<first>
{
    static const int value = first;
};
模板
结构最小值
{ /* […] */ };
模板
结构最小值
{
静态常量int值=第一个;
};

如果您认为如果专门化只包含在未计算的分支中,那么编译器不会实例化它:他必须验证表达式是否有效。

的短路行为不会阻止编译器计算这两个表达式<代码>最小值::值仍然必须格式正确。因此,当
a..
变为空时,您将得到一个
min
的实例化,没有为其定义专门化

可以通过专门指定单个参数来解决此问题:

模板
结构最小值
{
静态常数int值=a;
};
旁注(不回答min的实例化)。 可以使用constepr函数计算模板和非模板参数:

#include <iostream>

// Single Value
template <typename T>
inline constexpr const T&
min_of(const T& a) {
    return a;
}

// Multiple Values
template <typename T, typename ...Args>
inline constexpr const T&
min_of(const T& a, const T& b, const Args& ...args) {
    // std::min as constexpr is C++14
    return min_of((a < b) ? a : b, args...);
}

// Template Arguments
template <int A, int ... Other>
constexpr int min_of() {
    return min_of(A, Other...);
}


// Test
template <int Value>
void print() {
    std::cout << "   template: " << Value << '\n';
}

int main() {
    print<min_of<42,97,11,59>()>();
    std::cout << "no template: " << min_of(42,97,11,59) << '\n';
    return 0;
}
#包括
//单值
模板
内联常量&
最低成本(施工和验收){
返回a;
}
//多值
模板
内联常量&
最小值(常数T&a、常数T&b、常数参数和…参数){
//std::min作为constexpr是C++14
返回((astd::cout但为什么要计算min?所有代码都应该正确,不能有
false?无效的\u代码:有效的\u代码();
即使没有执行代码。但为什么要计算min?@Dave,因为它处于条件表达式的条件下?即使不是,编译器也必须实例化模板以验证表达式是否有效。更新了我的答案。这与SCE无关。模板id实际上包含在条件i中tself@Columbo我假设OP认为SCE会阻止
min
的实例化。尝试使用
constexpr
函数来实现这一点。