避免overloading on universal reference : tag dispatch
template<typename T>
void logAndAdd(T&& name){
logAndAddImpl(std::forward<T>(name),std::is_integral<T>());
}
如果name是个左值(int),则T为int&,这样std::is_integral
template<typename T>
void logAndAdd(T&& name)
{
logAndAddImpl(std::forward<T>(name),std::is_integral< typename std::remove_reference<T>::type>());
}
logAndAddImpl的实现:
template<typename T>
void logAndAddImpl(std::forward(<T>(name), std::false_type)
{
names.emplace(std::forward(<T>(name));
}
void logAndAddImpl(int idx, std::true_type)
{
names.emplace(nameFromIdx(idx));
}
但是对于:
class Person
{
public:
template<typename T>
explicit Person(T&& n) :name(std::forward<T>(n)) {} //perfect forwardint ctor;
explicit Person(int idx) :name(nameFromIdx(idx)) {}
private:
std::string name;
};
这个类的构造是无法使用tag dispatch方法的。
posted on 2022-03-24 18:11 Ultraman_X 阅读(31) 评论(0) 收藏 举报