static_assert依赖于类模板

时间:2015-06-11 17:58:10

标签: c++ class c++11 compile-time static-assert

请考虑以下代码:

template <unsigned int N>
struct myclass
{
    unsigned int f() {return N;}
    unsigned int g() {static_assert(N > 0, ""); return N-1;}
};

问题: 我是否保证以下代码将编译:

myclass<0> c;
c.f();

但以下情况不会:

myclass<0> c;
c.f();
c.g();

3 个答案:

答案 0 :(得分:11)

是的,你有这个保证。从[temp.inst] / 11开始,强调我的:

  

实现不得隐式实例化函数模板,变量模板,成员模板,   非虚拟成员函数,成员类或类模板的静态数据成员   不需要实例化

如果您不致电g(),则不需要实例化,因此调用myclass<0>{}.f()时不会出现任何问题。

这同样可以保证您只使用std::vector和{{{{{ 1}},分别。

后续,就像Jarod42 points out一样,显式实例化std::map会产生断言,因为来自[temp.explicit] / 8:

  

命名类模板特化的显式实例化也是一个显式实例化   每个成员的同类(声明或定义)(不包括从基础继承的成员   以前没有明确专门用于翻译的类和模板成员   包含显式实例化的单元,除非如下所述。

此处不适用例外情况。

答案 1 :(得分:0)

使用模板专业化:

from bs4 import BeautifulSoup
import requests

urls = []

for i in range(1, 5):
    offset = 36 * i
    r = requests.get('http://www.barneys.com/barneys-new-york/men/clothing/shirts/dress/classic?start=1&format=page-element&sz={}&_=1434647715868'.format(offset))
    soup = BeautifulSoup(r.text)

    links = soup.find_all("a", {"class": "thumb-link"})

    for link in links:
        if len(urls) < 176:
            print (link.get('href'))
            urls.append(link.get('href'))

答案 2 :(得分:-1)

如果你想在编译时禁用一个函数,你应该使用enable_if而不是static_assert

template<unsigned int N>
struct Foo {
    unsigned int f() {}
    enable_if_t<(N > 0), unsigned int> g() {}
};

Foo<0> t{};
t.f(); /// this is okay and will compile
// t.g() if I uncomment this line, it will not compile anymore.