在C ++中的每个实例化中生成一个新类型17

时间:2017-07-21 23:16:38

标签: c++ templates template-meta-programming constexpr c++17

请考虑以下代码:

foo

是否可以在C ++ 17中使用奇怪的技巧让bar1500508800000 成为不同的类型?

1 个答案:

答案 0 :(得分:6)

真实答案:否。如果您想要不同的类型,请编写不同的类型。整个概念都很疯狂。

玩具答案,当然。首先,您可以将类型设置为宏:

template <int N>
struct object {
    object(int ) { }
};

#define object object<__LINE__>

或者,既然我们正在变得厚颜无耻,那么您可以将两个名称foobar都设为宏:

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 ) { }
};