避免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为false,因为int&并不是整数。所以我们可以使用(tag dispatch):

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  阅读(19)  评论(0编辑  收藏  举报

导航