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

如何为C++模板条件类型参数设置匹配类型的默认值?

为C++模板trimStart函数提供类型匹配的默认trimChars值

问题描述

我正在编写一个基于C++模板的trimStart函数,初始代码如下:

template<typename T>
static T trimStart(T source, std::conditional<isWide<T>(), const wchar_t*, const char*>::type trimChars = " \t\n\r\v\f"))
{
    ....
}

需要根据trimChars的类型,为其提供对应的默认值——" \t\n\r\v\f"(对应窄字符串)或L" \t\n\r\v\f"(对应宽字符串),该如何实现?

解决方案(C++20)

在他人协助并查阅最新模板文档后,整理出以下代码框架:

1. 限制模板参数为字符串类型

通过concept约束模板仅接受std::string或std::wstring,避免无效类型传入:

// 限制T仅为std::string或std::wstring
template<typename T>
concept isStr = (
    std::is_same_v<T, std::string> ||
    std::is_same_v<T, std::wstring>
);

2. 编译期返回类型匹配的默认值

编写constexpr函数,利用if constexpr在编译期判断模板参数类型,返回对应的默认空白字符集:

// 根据T的类型返回对应默认空白字符集
template<typename T>
constexpr auto defaultValue() {
    if constexpr (std::is_same_v<T, std::wstring>)
        return L" \t\n\r\v\f";
    else
        return " \t\n\r\v\f";
}

3. 定义带默认参数的trimStart函数

使用decltype(defaultValue<T>())推导参数类型,并将defaultValue<T>()作为参数的默认值,实现类型匹配的默认参数:

// 带类型匹配默认参数的trimStart函数
template<isStr T>
static T trimStart(T source, decltype(defaultValue<T>()) trimChars = defaultValue<T>())
{
      //...内部逻辑示例
     typename std::conditional<some_conditional<T>(), std::wistringstream,std::istringstream>::type 
        ss(...);

}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:05:28