考虑以下模板:
template<class T>
void doStuff(const T& a)
{
if(std::is_copy_assignable<T>::value)
{
T x;
x=a;
printf("Hello\n");
}
else
{
printf("Goodbye\n");
}
}
即使“Hello”部分永远不会为不可复制赋值的类型运行,这也无法编译。我应该怎么做?
最佳答案
这是解决您问题的基于标签分派(dispatch)的方法:
template<class T>
void doStuffHelper(const T& a, std::true_type can_copy_assign)
{
T x;
x=a;
printf("Hello\n");
}
template<class T>
void doStuffHelper(const T& a, std::false_type can_copy_assign)
{
printf("Goodbye\n");
}
template<class T>
void doStuff(const T& a)
{
return doStuffHelper( a, std::is_copy_assignable<T>() );
}
这里,只编译有效的版本。 can_copy_assign
的名字仅用于文档 - 重点是我基于 std::is_copy_assignable<T>()
进行覆盖,然后我使用覆盖分派(dispatch)来选择我要使用的实现。
在您的代码中,if
block 变成类似 if(true)
的东西. else
if
的条款 block 即 if(true)
仍然需要编译,这意味着使用的方法必须有效,即使它们永远不会运行。
标签分派(dispatch)解决方案对其进行安排,以便使用使用这些属性的代码编译具有预期属性的函数。
可以使用涉及 SFINAE 的类似方法,但 SFINAE 有一些恼人的并发症,这意味着通常最好尽可能避免使用它。
关于c++ - 类型特征和特定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18134037/