如何在模板实例化中强制将 char[] 转换为 char*?
How do I force conversion char[] to char* in template instantiation?
假设我有一个函数:
#include <optional>
template <typename T>
std::optional<T> foo(T const &input);
它接受一个值,尝试使用它的副本,returns 说复制成功(std::nullopt
失败)。
但问题是,当将字符串文字传递给此类函数时,会发生错误T in optional<T> must meet the Cpp17Destructible requirements
。
由<optional>
中定义的static_assert(is_object_v<_Ty> && is_destructible_v<_Ty> && !is_array_v<_Ty>, ...)
引起。
下一个表达式正确运行:
foo((char const*) "bar");
这个失败了:
foo("bar");
问题是,我如何强制编译器将 char const[]
隐式转换为 char const*
?
P. S. 我知道这可以通过简单地重载函数来完成,因为我不太热衷于它导致的代码重复,所以我很好奇这里是否有替代解决方案。
编辑:重写了答案。有了return类型推导,这样就方便了。
template <typename T>
auto foo(T const &input){
auto copy {std::move(input)};
// ...
return std::optional{std::move(copy)};
}
不是您真正要求的,但认为不需要太多重复:
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);
}
假设我有一个函数:
#include <optional>
template <typename T>
std::optional<T> foo(T const &input);
它接受一个值,尝试使用它的副本,returns 说复制成功(std::nullopt
失败)。
但问题是,当将字符串文字传递给此类函数时,会发生错误T in optional<T> must meet the Cpp17Destructible requirements
。
由<optional>
中定义的static_assert(is_object_v<_Ty> && is_destructible_v<_Ty> && !is_array_v<_Ty>, ...)
引起。
下一个表达式正确运行:
foo((char const*) "bar");
这个失败了:
foo("bar");
问题是,我如何强制编译器将 char const[]
隐式转换为 char const*
?
P. S. 我知道这可以通过简单地重载函数来完成,因为我不太热衷于它导致的代码重复,所以我很好奇这里是否有替代解决方案。
编辑:重写了答案。有了return类型推导,这样就方便了。
template <typename T>
auto foo(T const &input){
auto copy {std::move(input)};
// ...
return std::optional{std::move(copy)};
}
不是您真正要求的,但认为不需要太多重复:
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);
}