如何在模板实例化中强制将char[]转换为char*?

问题描述 投票:2回答:1

假设我有一个函数。

#include <optional>

template <typename T>
std::optional<T> foo(T const &input);

它接受一个值,尝试使用它的一个副本,并在成功后返回该副本 (std::nullopt on fail)。)

但问题是,当一个字符串文字传递到这样的函数中时,会出现一个错误 T in optional<T> must meet the Cpp17Destructible requirements 发生。

这是由于 static_assert(is_object_v<_Ty> && is_destructible_v<_Ty> && !is_array_v<_Ty>, ...) 定义于 <optional>.

下一个表达式正确。

foo((char const*) "bar");

这个失败了

foo("bar");

问题是,我怎样才能迫使编译器隐式地转换为 char const[]char const*?

P. S. 我知道可以通过简单的重载函数来实现,但我不太喜欢重载函数造成的代码重复,所以我很好奇是否有另一种解决方案适用于这里。

c++ arrays templates optional c-strings
1个回答
2
投票

虽然考虑到不需要太多重复,但这并不是你真正想要的。

template <int s>
std::optional<const char*> foo(const char (&str)[s]) {
    return foo(&str[0]);
}

或者更简单

std::optional<char const*> foo(char const *input) { 
    return foo<char const *>(input); 
}

3
投票

编辑: 重写了答案. 有了返回类型的推导,这样就方便了。

template <typename T>
auto foo(T const &input){
    auto copy {std::move(input)};
    // ...
    return std::optional{std::move(copy)};
}
© www.soinside.com 2019 - 2024. All rights reserved.