如何将2个整数模板参数相加并使用结果来实例化另一个模板?

时间:2016-08-05 15:09:57

标签: c++ c++11

我正在尝试创建这样的东西:

$ dockerd --help
# ...
--ip=0.0.0.0             Default IP when binding container ports

我是从编译器得到的:

  

在功能' int main()':

     

19:16:错误:调用非constexpr函数' int FP :: addS(FP)[int K = 2; int L = 1]'

     

19:16:错误:调用非constexpr函数' int FP :: addS(FP)[int K = 2; int L = 1]'

     

19:17:注意:在类型' int'的模板参数中

     

19:22:错误:声明中的无效类型' ='令牌

     

19:33:错误:无法转换' FP< 3>'到' int'在初始化

     

19:19:警告:未使用的变量' n3' [-Wunused可变]    在< FP<(L + K)>的实例化中。 FP :: add(FP)[int K = 2; int L = 1]':

     

19:33:从这里要求

     

9:5:警告:函数返回non-void时没有return语句[-Wreturn-type]

我该如何解决这个问题?

通常,我想将结果保存到正确的变量,但不想计算正确的模板值。

3 个答案:

答案 0 :(得分:2)

问题在于:

FP<n1.addS(n2)>

因为addS的结果不是常量表达式。您必须将其标记为一个

template<int K> constexpr int addS(FP<K> a)

现在constexpr函数只有在它们的参数也是常量表达式时才会产生常量表达式,所以n1和n2也应该标记为constexpr。

constexpr FP<1> n1;
constexpr FP<2> n2;

答案 1 :(得分:1)

更简单的方法是使用auto

auto n3 = n1.add(n2);

否则你必须丢失constexpr

template<int L> 
class FP {
public:
    int n;

    template<int K> 
    FP<L+K> add(FP<K> a) const {
        FP<L+K> r;
        r.n = n+a.n;
        return r;
    }

    template<int K> constexpr static int addS(FP<K> a) {
        return L+K;
    }
};

int main()
{
   constexpr FP<1> n1;
   constexpr FP<2> n2;
   FP<n1.addS(n2)> n3 = n1.add(n2);
 }

答案 2 :(得分:0)

您可以使用auto

auto n3 = n1.add(n2);

或略微更改addS的声明:

template<int K>
static constexpr int addS(FP<K> &) {
    return L+K;
}

如@ Jarod42所述 否则,您还可以使用decltype

decltype(n1.add(n2)) n3 = n1.add(n2);

constexpr支持功能:

template<int I, int J>
constexpr int f(FP<I> &, FP<J> &) {
    return I+J;
}

// ...

FP<f(n1, n2)> n3 = n1.add(n2);

如果您不想更改addS的定义。