C++ 推断可变模板参数包元素的类型

C++ 推断可变模板参数包元素的类型,c++,c++11,templates,variadic-templates,C++,C++11,Templates,Variadic Templates,我有以下功能: template <typename T, T... Ts> T random_value(default_random_engine &rnd) { static constexpr T values [] { Ts... }; static uniform_int_distribution<size_t> distribution(0, sizeof...(Ts) - 1); return values[distribu

我有以下功能:

template <typename T, T... Ts> T random_value(default_random_engine &rnd)
{
    static constexpr T values [] { Ts... };
    static uniform_int_distribution<size_t> distribution(0, sizeof...(Ts) - 1);
    return values[distribution(rnd)];
}
模板T随机值(默认随机引擎&rnd)
{
静态constexpr T值[]{Ts..};
静态均匀分布(0,sizeof…(Ts)-1);
返回值[分布(rnd)];
}
这就是所谓的公正:

MyEnum val = random_value<MyEnum, MyEnum::val1, MyEnum::val2, MyEnum::val3>(rnd);
MyEnum val = random_value<MyEnum::val1, MyEnum::val2, MyEnum::val3>(rnd);
MyEnum val=random_值(rnd);
有没有可能重新定义它,这样我就不需要显式地指定t了?因此,我们称之为恰到好处:

MyEnum val = random_value<MyEnum, MyEnum::val1, MyEnum::val2, MyEnum::val3>(rnd);
MyEnum val = random_value<MyEnum::val1, MyEnum::val2, MyEnum::val3>(rnd);
MyEnum val=random_值(rnd);

目前还没有,但C++17中添加的新的
自动
模板参数功能将对此有所帮助。请参见

目前还没有,但是在C++17中添加的新的自动模板参数功能将对此有所帮助。请参阅

,您可以使用带有DeCype的宏,但我认为布莱恩是正确的,在C++中,您不能优雅地完成(或完全)。就像克里斯所说的,唯一的方法是用宏:<代码>定义随机值(x,…)随机值()/<代码>,你可以使用一个带有DECKEYPE的宏,但是我认为布莱恩是绝对不能在C++中优雅地(或全部)做的(暂时)。正如Chris所说,解决这个问题的唯一方法是使用宏:
#定义随机_值(x,…)随机_值()