2017-08-09 167 views
2

我想检查类型T是否也是参数包Ts的一部分。在C++ 14中有这样做的solutions,但是如果这可以在C++ 17中简化,我就会游荡。如果在Ts中找不到T,则应停止编译器(static_assertion应该失败)。检查模板类型T是否属于C++中的变量参数包17

template<typename... Ts> 
class A 
{ 
    template<typename T> 
    void action() { 
    // check that T is also in Ts (static_assertion) 
    } 
} 
+0

您链接到该解决方案是5号线长。你在寻找多少简化? – Sneftel

+1

我的问题[here](https://stackoverflow.com/questions/45578484/is-it-possible-to-get-the-first-type-of-a-parameter-pack-in-a-one-liner/45578533#45578533)有四条工作路线,答案只有一条。你在这里找到的解决方案是制作一个包中某些类型的vector元素的元组长度超过10行。它现在可以在一个。 – dani

+0

@Sneftel,你走了。需要一行代码。 – dani

回答

5

我听到折叠表达式是新的辣味:

static_assert((std::is_same_v<T, Ts> || ...)); 
+1

inc(vote)for“hotness”:D – Columbo

0

很容易在C++与折叠式:

template<typename... Ts> 
class A 
{ 
    template<typename T> 
    void action() { 
    static_assert((... || std::is_same_v<T, Ts>)), "Not!") 
    } 
} 
4

如果你喜欢一个库特点:

static_assert(std::disjunction_v<std::is_same<T, Ts>...>); 

请注意,这会执行shor (这里可能不是非常有益,但需要牢记)。折叠表达式是同样可行:

static_assert((std::is_same_v<T, Ts> || ...)); 

(从@Barry被盗。)

相关问题