如何将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
相关产品推荐
相关产品推荐

