使用c ++ 14,我有一些类似于以下内容的函数声明。
template <class... Args>
struct potato {
template <class T, class = std::enable_if_t<!std::is_same<T, int>::value>>
const T& blee(size_t blou) const;
template <class T, class = std::enable_if_t<std::is_same<T, int>::value>>
const T& blee(size_t blou) const;
};
是否可以单独实现功能?据我所知,编译器无法确定正在实现什么。例如:
template <class... Args>
template <class T, class>
const T& potato<Args...>::blee(size_t blou) const {
// do something
}
template <class... Args>
template <class T, class>
const T& potato<Args...>::blee(size_t blou) const {
// do something
}
此时enable_if
信息丢失。我是否在工具包中缺少技巧以实现此目的?请注意,我不希望使用返回类型enable_if
或参数enable_if
,因为它们是不敬虔的。
edit:已更新,可以更好地代表我的用例。
答案 0 :(得分:2)
您实际上不需要enable_if
:
template<class T>
const T& blee(size_t blou) const {
// do something
}
template<>
const int& blee<int>(size_t blou) const {
// do something
}
编辑:由于您的函数位于类模板中,因此您将必须使用标签分配:
template<class... Args>
struct potato {
template<class T>
void blee() const;
private:
void realBlee(std::true_type) const;
void realBlee(std::false_type) const;
};
template<class... Args>
template<class T>
void potato<Args...>::blee() const {
realBlee(std::is_same<T, int>());
}
template<class... Args>
void potato<Args...>::realBlee(std::true_type) const {
std::cout << "int\n";
}
template<class... Args>
void potato<Args...>::realBlee(std::false_type) const {
std::cout << "generic\n";
}
或类似的东西,例如constexpr,如果:
template<class... Args>
struct potato {
template<class T>
void blee() const;
private:
void intBlee() const;
};
template<class... Args>
template<class T>
void potato<Args...>::blee() const {
if constexpr (std::is_same_v<T, int>) {
intBlee();
} else {
std::cout << "generic\n";
}
}
template<class... Args>
void potato<Args...>::intBlee() const {
std::cout << "int\n";
}
答案 1 :(得分:0)
那时enable_if信息丢失。
它不会丢失,在两种情况下都是int
。只是没有实例化一个模板。