You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将main中的constexpr传递给非模板类B的构造函数?

可行方案:构造函数模板+编译期标记/可调用对象

你之前的误区是以为构造函数不能做模板——构造函数完全可以是模板函数,这正是解决问题的核心。下面提供两种不需要把B改成模板类的实现方式:

方法一:用std::integral_constant传递编译期常量

通过给B的构造函数添加非类型模板参数,并用std::integral_constant作为编译期标记来传递值,代码如下:

#include <iostream>
#include <type_traits> // 包含std::integral_constant

template <int param = 0>
class A
{
public:
    static constexpr void print()
    {
        std::cout << param << std::endl;
    }
};

class B
{
public:    
    // 构造函数模板,接收int类型的非类型模板参数
    template <int Val>
    B(std::integral_constant<int, Val>)
    {
        A<Val> a{};
        a.print(); // 验证参数是否正确传递
    }
};

int main()
{
    constexpr int val = 123;

    // 用integral_constant包装val,传递给B的构造函数
    B b{std::integral_constant<int, val>{}};
}

这种方式的优势是直观,编译期就能确定Val的值,完全符合你的需求。

方法二:C++20+:用constexpr lambda传递编译期值

如果你的编译器支持C++20,可以通过传递一个能返回编译期常量的lambda来实现,写法更灵活:

#include <iostream>

template <int param = 0>
class A
{
public:
    static constexpr void print()
    {
        std::cout << param << std::endl;
    }
};

class B
{
public:    
    // 构造函数模板,接收任意返回编译期常量的可调用对象
    template <auto GetVal>
    B(GetVal get_val)
    {
        constexpr int val = get_val();
        A<val> a{};
        a.print();
    }
};

int main()
{
    constexpr int val = 123;

    // 传递捕获val的constexpr lambda
    B b{[]() constexpr { return val; }};
}

补充说明

  • 构造函数模板是完全合法的C++语法,你之前的尝试大概率是语法错误(比如没有正确指定模板参数或传递标记类型)导致失败。
  • 这两种方法都不会改变B的普通类属性,B仍然是一个非模板类,只是构造函数有多个模板实例而已。

内容的提问来源于stack exchange,提问作者ShellfisH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:57:17