【发布时间】:2020-11-07 08:38:29
【问题描述】:
我想要一个只绑定到一种类型的转发引用。我可以使用静态断言, 但我想知道是否有更优雅的 (C++14/17) 方式来做到这一点。
这里是一个例子:
#include <iostream>
#include <string>
#include <type_traits>
template<class T>
void f(T&& x) {
// Is there a more elegant way to check for the type than the static_assert?
static_assert(std::is_same<std::string, typename std::remove_cv_t<std::remove_reference_t<T>>>::value);
x = x + "Bar";
std::cout << x << std::endl;
}
int main()
{
std::string name("Foo");
f(name);
f(std::move(name));
}
【问题讨论】:
-
您忘记将
std::remove_cv_t应用于remove_reference的结果。 -
requires (std::is_same_v<std::string, typename std::remove_cv_t<std::remove_reference_t<T>>>)怎么样 -
@asmmo:谢谢。但我坚持使用 C++14/17。我更新了问题以澄清。
-
您可以将检查移至第二个模板参数并依赖 SFINAE,但我会说这是最好的,因为您会收到清晰直接的错误消息。还有什么比 1 个 static_assert 更优雅的解决方案?
标签: c++ c++14 perfect-forwarding