请考虑以下代码:
foo
是否可以在C ++ 17中使用奇怪的技巧让bar
和1500508800000
成为不同的类型?
答案 0 :(得分:6)
真实答案:否。如果您想要不同的类型,请编写不同的类型。整个概念都很疯狂。
玩具答案,当然。首先,您可以将类型设置为宏:
template <int N>
struct object {
object(int ) { }
};
#define object object<__LINE__>
或者,既然我们正在变得厚颜无耻,那么您可以将两个名称foo
和bar
都设为宏:
template <int N>
struct object {
object(int ) { }
};
#define foo(x) <0> foo(x)
#define bar(x) <1> bar(x)
或者,也许只是其中之一:
template <class T>
struct object {
object(T ) { }
};
#define foo(x) <double> foo(x)
或者,您可以使用stateful metaprogramming来破解不同的值。这适用于gcc但不适用于clang:
template <int N>
struct flag
{
friend constexpr int adl_flag(flag<N>);
constexpr operator int() { return N; }
};
template <int N>
struct write
{
friend constexpr int adl_flag(flag<N>) { return N; }
static constexpr int value = N;
};
template <int N, int = adl_flag(flag<N>{})>
constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{}))
{
return R;
}
template <int N>
constexpr int read(float, flag<N>)
{
return N;
}
template <class T, int N=0, int R=write<read(0, flag<0>{})+N>::value>
struct object {
object(T ) { }
};