Почему я должен специализировать это? - PullRequest
0 голосов
/ 01 октября 2010

Что я делаю не так?

#include "stdafx.h"
#include <iostream>
#include <string>
using std::cout;
using std::string;

template<int v>
struct Int2Type
{
    enum {value = v};
};

template<bool condition,class Left, class Right>
struct Result;


template<class Left, class Right>
struct Result<true,Left,Right>
{
    typedef Left value;
};

template<class Left, class Right>
struct Result<false,Left,Right>
{
    typedef Right value;
};


struct Ternary
{
    template<class Left, class Right>
    static Right check_(Int2Type<false>, Left left, Right right)
    {
        return right;
    }

    template<class Left, class Right>
    static Left check_(Int2Type<true>, Left left, Right right)
    {
        return left;
    }

    template<class Left, class Right>
    static auto check(bool condition, Left left, Right right)-> decltype(Result<condition,Left,Right>::value)
    {
        return check_(Int2Type<condition>,left,right);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 5;
    string s = "Hello";
    cout << Ternary::check(false,a,s);
    return 0;
}

Я получаю сообщение об ошибке:
«Ошибка 1, ошибка C2893: не удалось специализировать шаблон функции« неизвестный тип »Ternary :: check (bool, Left, Right)»

Почему? EDIT

   template<class Left, class Right>
    static auto check(bool condition, Left left, Right right)-> 
        decltype(Result<(sizeof(int) == 1),Left,Right>::value)
    {
        return check_(Int2Type<condition>,left,right);
    }

добавлено:

Result<(sizeof(int) == 1)

Ответы [ 3 ]

2 голосов
/ 01 октября 2010

condition здесь - переменная вашей программы.

Параметр шаблона должен быть константным выражением (или типом), и поэтому переменная не подходит, так как компилятор не может выбрать правильную специализацию на основена информацию о времени выполнения.

0 голосов
/ 01 октября 2010

Просто напишите (после удаления check):

cout << Ternary::check_(IntToType<false>,a,s);
0 голосов
/ 01 октября 2010
static auto check(bool condition, Left left, Right right)-> decltype(Result<condition,Left,Right>::value)

Что ???

Вы не можете использовать переменную времени выполнения condition для параметризации шаблона во время компиляции!?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...