如何在C++模板中让同一个星号兼具乘法与指针类型双重含义?
C++模板中星号的双重用法示例
确实存在这样的C++模板写法,利用模板实例化的上下文差异,让同一个星号符号在不同场景下分别表示乘法运算符和指针类型声明。以下是几个简洁的实现示例:
基础分场景示例
#include <iostream> #include <type_traits> // 场景1:星号作为乘法运算符 template<typename T, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0> auto compute(T lhs, T rhs) { return lhs * rhs; // 此处*是乘法运算 } // 场景2:星号作为指针类型声明 template<typename T> struct type_modifier { using type = T*; // 此处*是指针类型修饰符 }; template<typename T> typename type_modifier<T>::type create() { return new T{}; } int main() { // 调用乘法版本 std::cout << compute(5, 6) << std::endl; // 输出30 // 调用指针版本 type_modifier<int>::type ptr = create<int>(); *ptr = 100; std::cout << *ptr << std::endl; // 输出100 delete ptr; return 0; }
函数重载统一接口示例
通过函数模板重载,让同一函数名的不同实例触发星号的不同语义:
#include <iostream> // 数值乘法:*为乘法运算符 template<typename T> auto process(T a, T b) -> decltype(a * b) { return a * b; } // 指针创建:*为指针类型声明 template<typename T> T* process(T*) { return new T{}; } int main() { std::cout << process(3, 4) << std::endl; // 乘法场景,输出12 int* p = process<int>(nullptr); *p = 15; std::cout << *p << std::endl; // 指针场景,输出15 delete p; }
这种写法的核心逻辑是:C++语法解析会根据代码上下文确定星号的语义,模板的不同实例化路径会进入不同的上下文环境,从而让同一个星号符号承担完全不同的功能——一处是算术乘法运算符,另一处是指针类型的修饰符。
内容的提问来源于stack exchange,提问作者ByteEater
相关产品推荐
相关产品推荐

