【发布时间】:2020-12-30 05:39:08
【问题描述】:
我想避免下面代码中的重复。
#include <iostream>
struct Bar{};
template <class... Args>
struct FooClass;
template <class... Args>
inline void foo(Args&&... args) {
FooClass<Args...>::impl(std::forward<Args>(args)...);
}
// Duplicate 1.
// Const ref version
template <>
struct FooClass<Bar const&> {
inline static void impl(const Bar& b) {
std::cout << "dup1" << std::endl;
}
};
// Duplicate 2.
// Copy version
template <>
struct FooClass<Bar> {
inline static void impl(const Bar& b) {
std::cout << "dup2" << std::endl;
}
};
// Duplicate 3.
// Non-const ref version
template <>
struct FooClass<Bar&> {
inline static void impl(const Bar& b) {
std::cout << "dup3" << std::endl;
}
};
int main()
{
const Bar b2;
foo(b2);
foo(Bar{});
Bar b;
foo(b);
}
我很确定这可以通过某种方式使用 enable_if 和通用引用,但我想不通。
顺便说一句,这个程序输出:
dup1
dup2
dup3
如果三个特化中的任何一个被注释掉,它将不会编译。
【问题讨论】:
标签: c++ templates c++14 variadic-templates